java递归查找树的节点_java递归方法建立搜索二叉树,具备查找关键字,插入新节点功能...

本文介绍了二叉排序树的定义和性质,其节点值唯一,中序遍历结果为有序递增序列。阐述了用递归方法建立、查找和插入二叉排序树节点的操作,还给出了Java代码实现,并提及了调试结果。

二叉排序树的定义:

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

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

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

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

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

如下图所示:

77d9fb99ddcd0241caf00eb31733d820.png

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

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

进行二叉排序树插入操作时,直接将要插入的值用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("输入有误");}

}

}

}

调试结果如下:

716409c37986153a5ab3d59011584dc4.png

27287a0e5c7eeaead1633866684cb6d5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值