5.3 刪除二叉搜索樹的最大元素和最小元素


在5.2中完成了樹的遍歷,這一節中將對如何從二叉搜索樹中刪除最大元素和最小元素做介紹:
我們要想刪除二分搜索樹的最小值和最大值,就需要先找到二分搜索樹的最小值和最大值,其實也還是很容易的,因為根據二叉搜索樹的特點,它的左子樹一定比當前節點要小,所以二叉搜索樹的最小值一定是左子樹一直往下走,一直走到底。同樣在二叉搜索樹中,右子樹節點值,一定比當前節點要大,所以右子樹一直往下走,就一定是最大值。

注意向左走一直到走不動並不是一定要達到葉子節點,只用達到走不動為止,看下圖的例子:

向左走到16就走不動了,但是16下面還有元素。

一、查詢操作

1.1 查詢二分搜索樹的最小節點

 // 尋找二分搜索樹的最小元素
    public E minimum() {
        if (size == 0) {
            throw new IllegalArgumentException("BST is empty");
        }

        Node ninNode = minimum(root);
        return ninNode.e;
    }

    // 返回以node為根的二分搜索樹的最小值所在的節點
    private Node minimum(Node node) {
        if (node.left == null) {
            return node;
        }

        //返回相應的節點的左子樹的最小值
        return minimum(node.left);
    }

1.2 查詢二分搜索樹的最大節點

 // 尋找二分搜索樹的最大元素
    public E maxmum() {
        if (size == 0)
            throw new IllegalArgumentException("BST is empty");
        Node maxNode = maxmum(root);

        return maxNode.e;
    }

    // 返回以node為根的二分搜索樹的最大值所在的節點
    private Node maxmum(Node node) {
        if (node.right == null) {
            return node;
        }

        return maxmum(node.right);
    }

二、刪除操作

刪除最小值的思路:
1)如果要刪除的節點是葉子節點,那么直接刪除
2)如果要刪除的節點下面有右子樹,那么只用將其下的右子樹整體上移成為上一個節點的左子樹即可

當刪除22這個節點后,把33這個節點及其以下的子樹變成41節點的左子樹即可。

2.1 刪除最小值
  public E removeMin() {
        E ret = minimum();//獲取最小元素
        root = removeMin(root);

        return ret;
    }

    // 刪除掉以node為根的二分搜索樹中的最小節點
    // 返回刪除節點后新的二分搜索樹的根
    private Node removeMin(Node node) {

        // 遞歸的終止條件,當前節點沒有左子樹了,那么就是最小節點了
        // 如果是最小節點,我們要做的是刪除當前節點,但是當前節點很可能是有右子樹的
        // 我們先把該節點的右子樹節點保存,然后就刪除掉該右子樹節點,最后把右子樹節點返回即可
        if (node.left == null) {
            Node rightNode = node.right;
            node.right = null; //左節點為空了,讓右子樹也為空,相當於脫離了樹
            size--;
            return rightNode;//返回右子樹是為了后面的綁定操作
        }

        // 沒有遞歸到底的情況,那么就遞歸調用其左子樹,這個調用的過程會返回被刪除節點的右子樹,
        //將返回的右子樹重新綁定到上一層的node的左節點上就相當於徹底刪除了那個元素
        node.left = removeMin(node.left);

        return node;// 刪除后,根節點依然是node,返回即可
    }
2.2 刪除最大值
 // 從二分搜索樹中刪除最大值所在節點
    public E removeMax() {
        E ret = maxmum();
        root = removeMax(root);
        return ret;
    }

    // 刪除掉以node為根的二分搜索樹中的最大節點
    // 返回刪除節點后新的二分搜索樹的根
    private Node removeMax(Node node) {
        if (node.right == null) {
            Node leftNode = node.left;
            node.left = null;
            size--;
            return leftNode;
        }

        node.right = removeMax(node.right);//等號"="左邊的相當於上一次的right,右邊相當於下一次返回的結果
        return node;

    }

 

源碼地址 https://github.com/FelixBin/dataStructure/blob/master/src/BST/BST.java

 

 

推薦是最好的支持,關注是最大的鼓勵。親愛的朋友,很榮幸在園子里遇到您。


免責聲明!

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



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