二叉树建立及其遍历的思路和实现

什么是二叉排序树?

1.二叉排序树又叫二叉查找树或者二叉搜索树,它首先是一个二叉树,而且必须满足下面的条件:

1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值;

2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值

3)左、右子树也分别为二叉排序树

4)没有键值相等的节点

2.除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍历。设二叉树的根节点所在层数为1,层序遍历就是从所在二叉树的根节点出发,首先访问第一层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历。

3.二叉排序树的插入
在二叉排序树中插入新结点,要保证插入后的二叉树仍符合二叉排序树的定义。
插入过程:
若二叉排序树为空,则待插入结点*S作为根结点插入到空树中;   
当非空时,将待插结点关键字S->key和树根关键字t->key进行比较,若s->key = t->key,则无须插入,若s->key< t->key,则插入到根的左子树中,若s->key> t->key,则插入到根的右子树中。而子树中的插入过程和在树中的插入过程相同,如此进行下去,直到把结点*s作为一个新的树叶插入到二叉排序树中,或者直到发现树已有相同关键字的结点为止。

4.二叉排序树的查找
假定二叉排序树的根结点指针为 root ,给定的关键字值为 K ,则查找算法可描述为:
① 置初值: q = root ;
② 如果 K = q -> key ,则查找成功,算法结束;
③ 否则,如果 K < q -> key ,而且 q 的左子树非空,则将 q 的左子树根送 q ,转步骤②;否则,查找失败,结束算法;
④ 否则,如果 K > q -> key ,而且 q 的右子树非空,则将 q 的右子树根送 q ,转步骤②;否则,查找失败,算法结束。

5.先(根)序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴ 访问根结点;

⑵ 遍历左子树;

⑶ 遍历右子树。

中(根)序遍历的递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴遍历左子树;

⑵访问根结点;

⑶遍历右子树。

.后(根)序遍历得递归算法定义:

若二叉树非空,则依次执行如下操作:

⑴遍历左子树;

⑵遍历右子树;

⑶访问根结点。

⑴访问结点本身(N),

⑵遍历该结点的左子树(L),

⑶遍历该结点的右子树(R)。

以上三种操作有六种执行次序:

NLR、LNR、LRN、NRL、RNL、RLN。

注意:

6.前三种次序与后三种次序对称,故只讨论先左后右的前三种次序。

 

 

注意:上边如果实在不能分清顺序可以先模拟每个小的二叉树都是有左右子节点的,先按顺序标出箭头,没有的在去掉就可以了。 0代表没有,先画出加0的二叉图顺序,

(这样更简单直观),画出后再去掉有0的节点,断掉的首尾连接就可以了,这里只举上边一个列子, 其它相同

程序:

先定义一个要存储的对象类,后面存储的就是这个类的对象

添加和查找数据

 

 

package observer;

public class SearchTree {

public TreeNode root;

public long size;

/**

 * 添加节点

 *

 */

public Boolean addTreeNode(Integer data){

if(null==root){

root=new TreeNode(data);

System.out.println("数据成功插入到平衡二叉树中");

return true;

}

TreeNode treeNode=new TreeNode(data);//被插数据

TreeNode currentNode=root;

TreeNode parentNode;

while(true){

parentNode=currentNode;//父节点保存

if(currentNode.data>data){//即将插入的数据比父节点小

currentNode=currentNode.left;

//当前父节点的左子节点为空

if(null==currentNode){

parentNode.left=treeNode;

treeNode.parent=parentNode;

System.out.println("数据成功插入到二叉查找树中");

size++;

return true;

}

}else if(currentNode.data<data){//插入的数据比父节点大

currentNode=currentNode.right;

//当前父节点的右子节点为空

if(null==currentNode){

parentNode.right=treeNode;

treeNode.parent=parentNode;

System.out.println("数据插入成功到二叉查找树中");

size++;

return true;

}

}

else{

System.out.println("输入数据与节点的数据相同");

return false;

}

}

}

/**

 * 查找数据

 */

public TreeNode findTreeNode(Integer data){

if(null==root){

return null;

}

TreeNode current=root;

while(current!=null){

if(current.data>data){

current=current.left;

}else if(current.data<data){

current=current.right;

}else{

return current;

}

}

return null;

}

}

三种遍历方法(递归)

 

 

 

 

package observer;

public class TreeOrder {

/**

 * 递归实现前序排列

 * @param args

 */

public static void preOrderMethodOne(TreeNode treeNode){

if(null!=treeNode){

System.out.println(treeNode.data+"  ");

if(null!=treeNode.left){

preOrderMethodOne(treeNode.left);

}

if(null!=treeNode.right){

preOrderMethodOne(treeNode.right);

}

}

}

/**

 * 递归实现中序遍历

 * @param args

 */

public static void medOrderMethodOne(TreeNode treeNode){

if(null!=treeNode){

if(null!=treeNode.left){

medOrderMethodOne(treeNode.left);

}

System.out.println(treeNode.data+"  ");

if(null!=treeNode.right){

medOrderMethodOne(treeNode.right);

}

}

}

/**

 * 递归实现后续遍历

 * @param args

 */

public static void postOrderMethodOne(TreeNode treeNode){

if(null!=treeNode){

if(null!=treeNode.left){

postOrderMethodOne(treeNode.left);

}

if(null!=treeNode.right){

postOrderMethodOne(treeNode.right);

}

System.out.println(treeNode.data+"  ");

}

}

}

测试类

package observer;

public class SearchTreeTest {

public static void main(String[] args) {

SearchTree tree=new SearchTree();

tree.addTreeNode(10);

 tree.addTreeNode(80);  

     tree.addTreeNode(20);  

     tree.addTreeNode(60);     

     tree.addTreeNode(10);  

     tree.addTreeNode(30);  

     tree.addTreeNode(70);  

     tree.addTreeNode(90);     

     tree.addTreeNode(100);  

     tree.addTreeNode(40);

     System.out.println("***********前序遍历**********");

     TreeOrder.preOrderMethodOne(tree.root);

     System.out.println("***********中序遍历**********");

     TreeOrder.medOrderMethodOne(tree.root);

     System.out.println("***********后序遍历**********");

     TreeOrder.postOrderMethodOne(tree.root);

     System.out.println("查找方法");

     TreeNode node = tree.findTreeNode(101);  

     System.out.println(node);

}

}

程序运行结果

数据成功插入到平衡二叉树中

数据插入成功到二叉查找树中

数据成功插入到二叉查找树中

数据插入成功到二叉查找树中

输入数据与节点的数据相同

数据成功插入到二叉查找树中

数据插入成功到二叉查找树中

数据插入成功到二叉查找树中

数据插入成功到二叉查找树中

数据插入成功到二叉查找树中

***********前序遍历**********

10  

80  

20  

60  

30  

40  

70  

90  

100  

***********中序遍历**********

10  

20  

30  

40  

60  

70  

80  

90  

100  

***********后序遍历**********

40  

30  

70  

60  

20  

100  

90  

80  

10  

查找方法

null

你可能感兴趣的:(java,二叉树,遍历,搜索,class)