二叉排序樹的概述及中序遍歷

概述:

首先進行下面的對比:

線性結構

順序存儲,不排序:查找困難

順序存儲,排序:刪除插入困難

鏈式存儲:無論是否排序,查找困難

綜合以上特點,我們就想有沒有一種結構,能夠刪除、查找、插入都不是那麼困難,能夠綜合上述優

點,這個時候我們就引入了二叉排序樹。

樹結構查找是將查找表按照某種規律建成樹結構。因爲建構的樹結構是按某種規律建立的,因此查找

過程也遵循這種規律,可以獲得較高的查找效率。

1、二叉排序樹的定義:

二叉排序樹,也叫二叉查找樹、二叉搜索樹,簡稱BST

二叉排序樹(Binary Sort Tree)或者是一棵空樹,或者是具有下列性質的二叉樹:

(1)若左子樹不空,則左子樹上所有節點的值均小於根節點的值;若右子樹不空,則右子樹上所有節

點的值均大於根節點的值。

(2)左右子樹也分別是二叉排序樹。

(3)沒有鍵值相等的節點。

如下圖所示就是一顆二叉排序樹:
在這裏插入圖片描述

2、二叉排序樹中的查找

若將查找表組織爲一棵二叉排序樹,則根據二叉排序樹的特點,查找過程爲:

(1) 若查找樹爲空,查找失敗;

(2) 若查找樹非空,將給定關鍵碼kx與查找樹根節點的關鍵碼進行比較:

a. 若相等,查找成功,結束查找過程。

b. 若給定關鍵碼kx小於根節點關鍵碼,查找將在左子樹上繼續進行,轉1;

c. 若給定關鍵碼kx大於根節點關鍵碼,查找將在右子樹上繼續進行,轉1;

代碼展示

節點類

package demo10;

public class Node {
    int value;
    Node left;
    Node right;

    public Node(int value){
        this.value=value;
    }

    /**
     * 向子樹中添加節點
     * @param node
     */
    public void add(Node node) {
        if(node==null){
            return;
        }else{
            //判斷傳入的節點的值比當前子樹的根節點的值大還是小
            //添加的節點比當前節點的值更小
            if(node.value<this.value){
                //如果左節點爲空
                if(this.left==null){
                    this.left=node;
                }
                //如果不爲空
                else{
                    this.left.add(node);
                }
            //添加的節點比當前節點的值大
            }else{
                if(this.right==null){
                    this.right=node;
                }else{
                    this.right.add(node);
                }
            }
        }
    }

    /**
     * 中序遍歷二叉排序樹,從小到大排序
     * @param node
     */
    public void midShow(Node node) {
        if(node==null){
            return;
        }
        midShow(node.left);
        System.out.print(node.value+" ");
        midShow(node.right);
    }
}

樹實體類

package demo10;

public class BinarySortTree {
    Node root;

    /**
     * 向二叉排序樹中添加節點
     * @param node
     */
    public void add(Node node){
        //如果是一棵空樹
        if(root==null){
            root=node;
        }else{
            root.add(node);
        }
    }

    /**
     * 中序遍歷二叉排序樹,從小到大的順序
     */
    public void midShow(){
        if(root!=null){
            root.midShow(root);
        }
    }
}

測試類

package demo10;

public class TestBinarySortTree {
    public static void main(String[] args) {
        int[] arr = new int[]{7,3,10,12,5,1,9};
        //創建一棵二叉排序樹
        BinarySortTree bst = new BinarySortTree();
        //循環添加
        for(int i:arr){
            bst.add(new Node(i));
        }
        //查看樹中的值
        System.out.println("二叉排序樹中序遍歷:");
        bst.midShow();
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章