定义:二叉排序树是一棵特殊的二叉树,对于树中的所有节点,如果有左右孩子,那么,左孩子的值比该节点的值都小,右孩子的值比该节点的值都大。
代码实现如下:
package 二叉排序树;
import java.util.ArrayList;
import java.util.Scanner;
public class SortTree {
//测试数据:13 1 6 4 8 7 10 3 14 -1
private int key;
private SortTree l;
private 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("输入有误");}
}
}
}