二叉排序樹的定義:
二叉排序樹滿足以下三個性質(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("輸入有誤");} } } }
調試結果如下:


