java遞歸方法建立搜索二叉樹,具備查找關鍵字,插入新節點功能


二叉排序樹的定義:

二叉排序樹滿足以下三個性質(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("輸入有誤");}
        }
    }
    
}

 

調試結果如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM