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

二叉排序树的定义:

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

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

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

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

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

如下图所示:

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


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

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

进行二叉排序树插入操作时,直接将要插入的值用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递归方法建立搜索二叉树,具备查找关键字,插入新节点功能

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

你可能感兴趣的:(java,数据结构,查找,二叉排序树,插入,中序遍历)