二叉排序树的定义:

二叉排序树满足以下三个性质(BST性质):

<1>若它的左子树非空,则左子树上所有节点的值均小于根节点的值

<2>若它的右子树非空,则右子树上所有节点的值均大于根节点的值

<3>左,右子树本身又各是一棵二叉排序树

根据二叉排序树的BST性质,可以说二叉排序树每个节点上的值(或称关键字)都是唯一的,并且二叉排序树以中序遍历输出的结果必然是一个有序的递增序列。

如下图所示:

java递归 没有子节点就删除 java递归查找子节点_java递归查找树的节点

用递归方法建立二叉排序树,减少了繁复的比较程序,效率较高。只需要知道每个节点的值,按照递归的方法,首先获取第一个节点的值,然后获取第二个节点的值,将第二个节点与第一个节点进行比较,若小于,则将第二个节点的值放在左子树,若大于,则将第二个节点的值放在右子树,循序渐进,递归每个节点的值,最终建立一棵完整的二叉排序树。

进行二叉排序树查找操作时,传递要查找的值,先与根节点进行比较,若不等于根节点,则根据该查找的值与根节点的大小,递归遍历左子树或者右子树。直到找到该查找值,输出结果。

进行二叉排序树插入操作时,直接将要插入的值用ArrayList链表存入数组,遍历数组,传入新的节点值,继续调用递归方法进行二叉排序树的建立。最终的结果以中序遍历二叉树输出。

代码如下:

package二叉排序树;importjava.util.ArrayList;importjava.util.Scanner;public classSortTree {/***@author刘雁冰
* @date 2015-02-09 18:32*/
/** 具备建立搜索二叉树,查找关键字,以及插入新节点功能
*
* key:关键字,这里可以作为节点的值
* l:左子树
* r:右子树*/
public intkey;publicSortTree l;publicSortTree r;/** 递归方法建立一棵二叉排序树*/
public void bulitTree(intkey){//新加入来的节点先与根节点的值进行比较,小于根节点放入左子树,大于根节点放入右子树
if(key
}else
//左子树递归建立二叉树
this.l.bulitTree(key);
}else if(key>this.key){if(this.r==null){this.r=newSortTree();this.r.key=key;
}else
//右子树递归建立二叉树
this.r.bulitTree(key);
}
}/** 递归寻找关键字,若存在关键字返回提示信息*/
public void seach(intkey){//先与根节点进行比较,若不等于根节点,则根据该查找的值与根节点的大小,递归遍历左子树或者右子树
if(key==this.key)
System.out.println("找得到当前值:"+this.key);else if(key
this.r.seach(key);
}public voidinorder(){if(this.l!=null)
l.inorder();
System.out.print(this.key+",");if(this.r!=null)
r.inorder();
}public static voidmain(String[] args) {//TODO Auto-generated method stub
System.out.println("输入节点,第一个输入的作为二叉树的根节点(输入-1结束输入):");
Scanner sc=newScanner(System.in);
ArrayListlist=new ArrayList();int n=sc.nextInt();while(n!=-1){
list.add(n);
n=sc.nextInt();
}int []data=new int[(list.size())];for(int i=0;i
data[i]=list.get(i);
}
SortTree st=newSortTree();
st.key=data[0];for(int i=1;i
st.bulitTree(data[i]);
}
System.out.println("建立的搜索二叉树如下(以中序遍历输出):");
st.inorder();
System.out.println();
System.out.println("输入要进行的操作:");
System.out.println("1.查找当前值");
System.out.println("2.插入新的节点");int choice=sc.nextInt();switch(choice){case 1:{
System.out.println("输入要查找的值:");int k=sc.nextInt();
st.seach(k);break;
}case 2:{
System.out.println("请输入新节点的值(输入-1结束输入):");int m=sc.nextInt();while(m!=-1){
list.add(m);
m=sc.nextInt();
}for(int i=data.length-1;i
st.bulitTree(list.get(i));
}
System.out.println("插入新的节点后,二叉搜索树的结果如下(以中序遍历输出):");
st.inorder();break;
}default:{System.out.println("输入有误");}
}
}
}

调试结果如下:

java递归 没有子节点就删除 java递归查找子节点_System_02

java递归 没有子节点就删除 java递归查找子节点_二叉排序树_03