1. 程式人生 > >數據結構_樹_二叉搜索樹

數據結構_樹_二叉搜索樹

new 時間 sys else if 數據 深度 return set 中序

二叉搜索樹

二叉搜索樹(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.刪除節點

數據結構_樹_二叉搜索樹