标签:
二叉排序树的定义:
二叉排序树满足以下三个性质(BST性质):
<1>若它的左子树非空,则左子树上所有节点的值均小于根节点的值
<2>若它的右子树非空,则右子树上所有节点的值均大于根节点的值
<3>左,右子树本身又各是一棵二叉排序树
根据二叉排序树的BST性质,可以说二叉排序树每个节点上的值(或称关键字)都是唯一的,并且二叉排序树以中序遍历输出的结果必然是一个有序的递增序列。
如下图所示:
用递归方法建立二叉排序树,减少了繁复的比较程序,效率较高。只需要知道每个节点的值,按照递归的方法,首先获取第一个节点的值,然后获取第二个节点的值,将第二个节点与第一个节点进行比较,若小于,则将第二个节点的值放在左子树,若大于,则将第二个节点的值放在右子树,循序渐进,递归每个节点的值,最终建立一棵完整的二叉排序树。
进行二叉排序树查找操作时,传递要查找的值,先与根节点进行比较,若不等于根节点,则根据该查找的值与根节点的大小,递归遍历左子树或者右子树。直到找到该查找值,输出结果。
进行二叉排序树插入操作时,直接将要插入的值用ArrayList链表存入数组,遍历数组,传入新的节点值,继续调用递归方法进行二叉排序树的建立。最终的结果以中序遍历二叉树输出。
代码如下:
package 二叉排序树; import java.util.ArrayList; import java.util.Scanner; public class SortTree { /** * @author 刘雁冰 * @date 2015-02-09 18:32 */ /* * 具备建立搜索二叉树,查找关键字,以及插入新节点功能 * * key:关键字,这里可以作为节点的值 * l:左子树 * r:右子树 */ public int key; public SortTree l; public SortTree r; /* * 递归方法建立一棵二叉排序树 */ public void bulitTree(int key){ //新加入来的节点先与根节点的值进行比较,小于根节点放入左子树,大于根节点放入右子树 if(key<this.key){ if(this.l==null){ this.l=new SortTree(); this.l.key=key; } else //左子树递归建立二叉树 this.l.bulitTree(key); } else if(key>this.key){ if(this.r==null){ this.r=new SortTree(); this.r.key=key; } else //右子树递归建立二叉树 this.r.bulitTree(key); } } /* * 递归寻找关键字,若存在关键字返回提示信息 */ public void seach(int key){ //先与根节点进行比较,若不等于根节点,则根据该查找的值与根节点的大小,递归遍历左子树或者右子树 if(key==this.key) System.out.println("找得到当前值:"+this.key); else if(key<this.key) this.l.seach(key); else this.r.seach(key); } public void inorder(){ if(this.l!=null) l.inorder(); System.out.print(this.key+","); if(this.r!=null) r.inorder(); } public static void main(String[] args) { // TODO Auto-generated method stub System.out.println("输入节点,第一个输入的作为二叉树的根节点(输入-1结束输入):"); Scanner sc=new Scanner(System.in); ArrayList<Integer>list=new ArrayList<Integer>(); int n=sc.nextInt(); while(n!=-1){ list.add(n); n=sc.nextInt(); } int []data=new int[(list.size())]; for(int i=0;i<list.size();i++){ data[i]=list.get(i); } SortTree st=new SortTree(); st.key=data[0]; for(int i=1;i<data.length;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<list.size();i++){ st.bulitTree(list.get(i)); } System.out.println("插入新的节点后,二叉搜索树的结果如下(以中序遍历输出):"); st.inorder(); break; } default:{System.out.println("输入有误");} } } }
调试结果如下:
java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能
标签:
原文地址:http://www.cnblogs.com/luckid/p/4282449.html