本来这个随笔应该在4月17号就应该发出来的。不巧的是,那天晚上收到了offer,然后接下去两天为入职到处跑,20号入职后一直忙,直到最近几天才有时间看看书。然而20多天前就看完的了二叉树,然后17号那天正在按照二叉树的定义自己写一个完整的二叉树。本来那天晚上就能完成的,这么一个打断,导致现在想接上去之前的思路继续写二叉树有点难了。所以二叉树里面的删除部分以及Iterator部分直接是看着书写的......

下面是MyBinaryTree.java

//MyBinaryTree.java
package struct; import java.util.ArrayList;
import java.util.Iterator; public class MyBinaryTree<E extends Comparable<E>>
{
private TreeNode<E> root;
private int treeSize=0; public MyBinaryTree()
{} public MyBinaryTree(E[] o)
{
for(int i=0;i<o.length;i++)
{
insert(o[i]);
}
} private class TreeNode<E extends Comparable<E>>
{
public E element;
public TreeNode<E> leftChild;
public TreeNode<E> rightChild; public TreeNode()
{} public TreeNode(E o)
{
this.element = o;
}
} //寻找一个元素
public boolean search(E o)
{
TreeNode<E> current; if(root == null)
return false;
else
{
current=root; while(true)
{
if(current.element.compareTo(o) == 0) //相等
{
return true;
}
else if(current.element.compareTo(o) > 0) //current.element大
{
if(current.leftChild!=null) current = current.leftChild;
else
return false;
}
else if(current.element.compareTo(o) < 0) //o大
{
if(current.rightChild!=null) current = current.rightChild;
else
return false;
}
else
return false;
}
}
} //插入一个元素
public boolean insert(E o)
{
TreeNode<E> current; if(root==null)
{
root = new TreeNode<E>(o);
treeSize++;
return true;
}
else
{
current=root; while(true)
{
if(current.element.compareTo(o) > 0) //current.element大
{
if(current.leftChild!=null) current = current.leftChild;
else
{
current.leftChild = new TreeNode<E>(o);
treeSize++;
return true;
}
}
else if(current.element.compareTo(o) < 0) //o大
{
if(current.rightChild!=null) current = current.rightChild;
else
{
current.rightChild = new TreeNode<E>(o);
treeSize++;
return true;
}
}
else
{
return false;
}
}
}
} //删除一个元素
public boolean delete(E o)
{
TreeNode<E> current=root;
TreeNode<E> parent=null; //current==root==null返回false
if(current==null)
return false;
//寻找一个相等的元素
while(current.element.compareTo(o)!=0)
{
if(current.element.compareTo(o) > 0)
{
if(current.leftChild == null)
return false;
else
{
parent = current;
current = current.leftChild;
}
}
else
{
if(current.rightChild == null)
return false;
else
{
parent = current;
current = current.rightChild;
}
}
} //找到一个相等的元素之后,左右子树均为空
if(current.leftChild==null && current.rightChild==null)
{
current = null;
treeSize--;
return true;
}
else if(current.leftChild==null)//左子树为空
{
if(parent==null)
root=current.rightChild;
else
{
if(parent.element.compareTo(o)>0)
parent.leftChild=current.rightChild;
else
parent.rightChild=current.rightChild;
}
treeSize--;
return true;
}
else
{
//右子树为空,或者左右子树均不为空
TreeNode<E> parentOfBiggest = current;
TreeNode<E> theBiggest = current.leftChild; while(theBiggest.rightChild!=null)
{
parentOfBiggest=theBiggest;
theBiggest = theBiggest.rightChild;
} current.element = theBiggest.element; if(parentOfBiggest.rightChild == theBiggest)
parentOfBiggest.rightChild = theBiggest.leftChild;
else
parentOfBiggest.leftChild = theBiggest.leftChild; treeSize--;
return true;
}
} //中序
public void inorder()
{
TreeNode<E> current;
current = root;
if(current!=null)
{
inorder(current.leftChild);
System.out.print(current.element+" ");
inorder(current.rightChild);
System.out.println();
}
} private void inorder(TreeNode<E> current)
{
if(current!=null)
{
inorder(current.leftChild);
System.out.print(current.element+" ");
inorder(current.rightChild);
}
} //前序
public void preorder()
{
TreeNode<E> current;
current = root;
if(current!=null)
{
System.out.print(current.element+" ");
preorder(current.leftChild);
preorder(current.rightChild);
System.out.println();
}
} private void preorder(TreeNode<E> current)
{
if(current!=null)
{
System.out.print(current.element+" ");
preorder(current.leftChild);
preorder(current.rightChild);
}
} //后序
public void postorder()
{
TreeNode<E> current;
current = root;
if(current!=null)
{
postorder(current.leftChild);
postorder(current.rightChild);
System.out.print(current.element+" ");
System.out.println();
}
} private void postorder(TreeNode<E> current)
{
if(current!=null)
{
postorder(current.leftChild);
postorder(current.rightChild);
System.out.print(current.element+" ");
}
} //get树的大小
public int getSize()
{
return treeSize;
} //是否为空
public boolean isEmpty()
{
return treeSize==0;
} //iterator
public Iterator iterator()
{
return inorderIterator();
} //清空
public void clear()
{
root=null;
treeSize=0;
} public Iterator inorderIterator()
{
return new InorderIterator();
} class InorderIterator implements Iterator
{
private ArrayList<E> list = new ArrayList<E>();
private int current = 0; public InorderIterator()
{
inorder();
} private void inorder()
{
inorder(root);
} private void inorder(TreeNode<E> root)
{
if(null == root)
return;
inorder(root.leftChild);
list.add(root.element);
inorder(root.rightChild);
} @Override
public boolean hasNext()
{
if(current < list.size())
return true; return false;
} @Override
public Object next()
{
return list.get(current++);
} public void remove()
{
delete(list.get(current));
list.clear();
inorder();
}
}
}

下面是MyBinaryTreeTest.java

//MyBinaryTreeTest.java
package struct; public class MyBinaryTreeTest
{
public static void main(String[] args)
{
MyBinaryTree<Integer> mbt = new MyBinaryTree<Integer>();
mbt.insert(12);
mbt.insert(34);
mbt.insert(6);
mbt.insert(24);
mbt.insert(4);
mbt.insert(346);
mbt.insert(40);
mbt.insert(346); System.out.println("mbt size: "+mbt.getSize()); if(!mbt.search(346))
System.out.println("did not contains!");
else
System.out.println("have this number!"); System.out.print("mbt inorder: ");
mbt.inorder();
System.out.print("mbt preorder: ");
mbt.preorder();
System.out.print("mbt postorder: ");
mbt.postorder(); Integer[] a = new Integer[]{56,26,24,89,1,100,7,55,43,1};
MyBinaryTree<Integer> mbt2 = new MyBinaryTree<Integer>(a); System.out.print("mbt2 inorder: ");
mbt2.inorder();
System.out.print("mbt2 preorder: ");
mbt2.preorder();
System.out.print("mbt2 postorder: ");
mbt2.postorder(); System.out.println("mbt2 size: "+mbt2.getSize());
mbt2.clear();
System.out.println("mbt2 size: "+mbt2.getSize()); if(!mbt2.search(1))
System.out.println("did not contains!");
else
System.out.println("have this number!"); MyBinaryTree<Integer> mbt3 = new MyBinaryTree<Integer>(a);
System.out.print("mbt3 inorder: ");
mbt3.inorder();
System.out.print("mbt3 preorder: ");
mbt3.preorder();
System.out.print("mbt3 postorder: ");
mbt3.postorder(); System.out.println("before delete size:"+mbt3.getSize());
System.out.println(mbt3.delete(26));
System.out.println("after delete size:"+mbt3.getSize());
System.out.print("mbt3 inorder: ");
mbt3.inorder();
System.out.print("mbt3 preorder: ");
mbt3.preorder();
System.out.print("mbt3 postorder: ");
mbt3.postorder(); System.out.println("before delete size:"+mbt3.getSize());
System.out.println(mbt3.delete(1888));
System.out.println("after delete size:"+mbt3.getSize());
}
}

最后是运行结果

//result
mbt size: 7
have this number!
mbt inorder: 4 6 12 24 34 40 346
mbt preorder: 12 6 4 34 24 346 40
mbt postorder: 4 6 24 40 346 34 12
mbt2 inorder: 1 7 24 26 43 55 56 89 100
mbt2 preorder: 56 26 24 1 7 55 43 89 100
mbt2 postorder: 7 1 24 43 55 26 100 89 56
mbt2 size: 9
mbt2 size: 0
did not contains!
mbt3 inorder: 1 7 24 26 43 55 56 89 100
mbt3 preorder: 56 26 24 1 7 55 43 89 100
mbt3 postorder: 7 1 24 43 55 26 100 89 56
before delete size:9
true
after delete size:8
mbt3 inorder: 1 7 24 43 55 56 89 100
mbt3 preorder: 56 24 1 7 55 43 89 100
mbt3 postorder: 7 1 43 55 24 100 89 56
before delete size:8
false
after delete size:8

Java-数据结构之二叉树练习的更多相关文章

  1. java数据结构之二叉树的实现

    java二叉树的简单实现,可以简单实现深度为n的二叉树的建立,二叉树的前序遍历,中序遍历,后序遍历输出. /** *数据结构之树的实现 *2016/4/29 * **/ package cn.Link ...

  2. Java数据结构之二叉树的基本介绍与递归遍历

    二叉树的基本概念: 正如我们所了解的,树是有很多中形态,但是我们规定,形如每个节点最多只能有两个子节点的一种形如称为二叉树.我们将二叉树中该节点的两个子节点分别称作为:左孩子节点和右孩子节点.该节点称 ...

  3. JAVA数据结构之二叉树

    用树作为存储数据的结构兼具像数组一样查询速度快和像链表一样具有很快的插入和删除数据项的优点 我们用圆点表示节点,连接圆的直线表示边如下图所示就表示了一颗树,接下来我们讨论的二叉树即每个节点最多只有两个 ...

  4. java数据结构之二叉树遍历的非递归实现

    算法概述递归算法简洁明了.可读性好,但与非递归算法相比要消耗更多的时间和存储空间.为提高效率,我们可采用一种非递归的二叉树遍历算法.非递归的实现要借助栈来实现,因为堆栈的先进后出的结构和递归很相似.对 ...

  5. java数据结构之二叉树的定义和递归实现

    定义最多有两棵子树的有序树,称为二叉树.二叉树是一种特殊的树.递归定义:二叉树是n(n>=0)个有限结点构成的集合.N=0称为空二叉树:n>0的二叉树由一个根结点和两互不相交的,分别称为左 ...

  6. Java数据结构之树和二叉树(2)

    从这里始将要继续进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来 ...

  7. Java数据结构之树和二叉树

    从这里开始将要进行Java数据结构的相关讲解,Are you ready?Let's go~~ Java中的数据结构模型可以分为一下几部分: 1.线性结构 2.树形结构 3.图形或者网状结构 接下来的 ...

  8. Java数据结构和算法 - 二叉树

    前言 数据结构可划分为线性结构.树型结构和图型结构三大类.前面几篇讨论了数组.栈和队列.链表都是线性结构.树型结构中每个结点只允许有一个直接前驱结点,但允许有一个以上直接后驱结点.树型结构有树和二叉树 ...

  9. Java数据结构和算法(六)--二叉树

    什么是树? 上面图例就是一个树,用圆代表节点,连接圆的直线代表边.树的顶端总有一个节点,通过它连接第二层的节点,然后第二层连向更下一层的节点,以此递推 ,所以树的顶端小,底部大.和现实中的树是相反的, ...

  10. 【java 数据结构】还不会二叉树?一篇搞定二叉树

    二叉树是我们常见的数据结构之一,在学习二叉树之前我们需要知道什么是树,什么是二叉树,本篇主要讲述了二叉树,以及二叉树的遍历. 你能get到的知识点? 1.树的介绍 2.二叉树的介绍 3.二叉树遍历的四 ...

随机推荐

  1. 从PeopleEditor控件中取出多用户并更新到列表

    如果一个列表中有一个字段类型为用户或用户组,并且设置为用户,允许多值的话,那么用代码进行更新的时候就必须将这个字段的值赋成SPFieldUserValueCollection类型,以下代码即为从Peo ...

  2. 我的Java修养

    无论如何我都会以这种方式严于律己,如有错误接受修正. 1.戒掉对友情和爱情的幻想 2.针对人的行为进行分析,而不是其语言 3.解决一个问题,这个问题会成为解决后续问题的基础和前提 4.不要炫耀,自负, ...

  3. 优先队列(priority_queue)的cmp,POJ(2051)

    sort()函数的cmp为函数,priority_queue的cmp为类,具体写法是: struct Node { int i,j; } node[]; struct cmp { bool opera ...

  4. node执行环境

    nodejs本质上是一个javascript的执行环境,只是由于他的封装,加上更多web底层的一个处理,赋予了更多的能力,那么执行环境到底是什么呢,我们到浏览器里面体验看看,在chrome里面控制台, ...

  5. django中csrftoken跨站请求伪造的几种方式

    1.介绍 我们之前从前端给后端发送数据的时候,一直都是把setting中中间件里的的csrftoken这条给注释掉,其实这个主要起了一个对保护作用,以免恶意性数据的攻击.但是这样直接注释掉并不是理智型 ...

  6. 前端JavaScript之DOM节点操作

    1.HTML DOM是啥 Document Object Model:定义了访问和操作HTML文档的标准方法,把HTML文档呈现为带有元素,属性和文本的树状结构 2.解析过程 HTML加载完毕,渲染引 ...

  7. Maven 引入war工程【work】

    场景: 之前为了便于查看生产者项目缓存情况,做了一套界面,用来查看刷新缓存.然而最近发现消费者项目上也需要这套缓存界面,因此打算将这套界面代码迁移成独立的web项目,然后由生产者和消费者通过POM文件 ...

  8. vue2.0之监听属性的使用心得及搭配计算属性的使用

    我们在工作中常常需要监听某一个属性值的变化,这个时候我们就需要用到了监听属性watch,在这里我总结watch属性的三种场景使用希望对你有所帮助: 1.基础版监听: 场景如下:输入框输入你的年龄,如果 ...

  9. Eclipse中文乱码解决方案

    Eclipse中文乱码解决方案 1)第一个设置:window>perferences>general>workspace>text file encoding 2)Jsp编码问 ...

  10. Windows Subsystem for Linux(WSL)安装记录

    什么是WSL Windows Subsystem for Linux(简称WSL)是一个为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层.它是由微软与Canoni ...