1. 程式人生 > 其它 >二叉排序樹建立詳解

二叉排序樹建立詳解

二叉排序樹建立詳解

說明

  1. 二叉排序樹是二叉樹的一種,它的左子節點元素值總是小於父節點,右子節點值總是大於父節點
  2. 而且它各個節點之間通過引用連線,具有連結串列的靈活結構,因此增加和刪除元素是非常快的,只需要判斷當前要新增的值和葉子節點的大小關係,然後新增即可
  3. 也因為它的左右子節點值和父節點值的關係,使用二叉排序樹在查詢元素時總能折半查詢,類似二分查詢,因此具有很高的查詢效率
  4. 二叉排序樹新增節點思路:
  5. 先判斷要新增的節點元素值和當前節點元素值的大小關係
  6. 如果要新增的元素大於當前元素,則應該新增到當前節點的右邊,再判斷當前節點的右側是否為空,如果為空,則直接新增,如果不為空則遞迴新增
  7. 如果要新增的元素小於等於當前元素,則應該新增到當前節點的左側,同理,如果當前節點的左側為空,則直接新增,否則遞迴新增
  8. 中序遍歷較為簡單,不再說明
  9. 原始碼見下

原始碼及分析

//測試
public static void main(String[] args) {
        int[] arr = {7, 3, 10, 12, 5, 1, 9};
        BST bst = new BST();
        //迴圈新增節點
        for (int i = 0; i < arr.length; i++) {
            bst.add(new Node(arr[i]));
        }
        //中序遍歷檢視
        System.out.println("中序遍歷");
        bst.infixOrder();
    }

//二叉排序樹
class BST{
    private Node root;

    //中序遍歷
    public void infixOrder(){
        if (root != null){
            root.infixOrder();
        }else {
            System.out.println("樹是空的");
        }
    }
    //新增節點
    public void add(Node node){
        if (root == null){
            root = node;
        }else {
            root.add(node);
        }
    }

}

//節點
class Node {
    int value;
    Node left;
    Node right;

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

    //遞迴新增節點的方法
    public void add(Node node) {
        //資料校驗
        if (node == null) {
            return;
        }
        //根據要新增的節點的值和當前節點值的大小判斷節點要新增的位置
        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);
            }
        }
    }
    //中序遍歷
    public void infixOrder(){
        if (this.left != null){
            this.left.infixOrder();
        }
        System.out.println(this);
        if (this.right != null){
            this.right.infixOrder();
        }
    }

    @Override
    public String toString() {
        return "Node{" +
                "value=" + value +
                '}';
    }
}