1. 程式人生 > >資料結構_樹_二叉搜尋樹

資料結構_樹_二叉搜尋樹

二叉搜尋樹

二叉搜尋樹(BST)又稱為二叉查詢樹、二叉排序樹。

1.特徵

二叉搜尋樹首先是一棵二叉樹;
對任意節點,如果其左子樹不為空,則左子樹上任意節點的值均不大於它的根節點的值;
如果其右子樹不為空,則右子樹上任意節點的值均不大於它的根節點的值;
任意節點的左右子樹也分別是二叉搜尋樹。

2.中序遍歷

中序遍歷二叉搜尋樹,得到的結果是有序的資料列。

    // 中序遍歷二叉搜尋樹,結果是排好序的資料
    public void midOrder(TreeNode node){
        if(node == null){
            return;
        }
        midOrder(node.getLeft());
        System.out.print(node.getKey() + " ");
        midOrder(node.getRight());
    }

3.新增節點

二叉搜尋樹新增的新節點總是成為葉子節點。

    // 新增節點構造二叉搜尋樹
    public TreeNode addNode(TreeNode node, int key){
        // 如果不存在則建立節點,否則直接返回
        if(node == null){
            node = new TreeNode(key);
        }
        if(key < node.getKey()){
            node.setLeft(addNode(node.getLeft(), key));
        }else if(key > node.getKey()){
            node.setRight(addNode(node.getRight(), key));
        }else{
            return node;
        }
        return node;
    }

4.查詢節點

需要遍歷二叉搜尋樹,時間複雜度取決於遍歷的深度。

    // 查詢某個節點,時間複雜度為走過的層數,最壞為O(H)
    public TreeNode searchNode(TreeNode node, int key){
        // 如果找不到返回null,找到則直接返回
        if(node == null || node.getKey() == key){
            return node;
        }else if(key < node.getKey()){
            return searchNode(node.getLeft(), key);
        }else{
            return searchNode(node.getRight(), key);
        }
    }

5.刪除節點