二叉樹刪除節點詳解


二叉樹刪除節點詳解

說明

  1. 二叉樹刪除節點,如果刪除的是葉子節點,則找到后直接刪除,如果是非葉子節點,則刪除該子樹
  2. 因為沒有針對某種特定的二叉樹,因此沒有考慮如果是非葉子節點,只刪除該節點的情況
  3. 刪除節點思路
  4. 先判斷該二叉樹是否為空,如果不為空,則判斷該二叉樹的根節點是不是需要刪除的節點,如果是,則直接刪除並返回,如果不是,則遞歸查找根節點的左子樹和右子樹,找到則刪除
  5. 因為二叉樹是單向指向的,因此如果要刪除某個節點,必須找到該節點的上一個節點,如果直接找到要刪除的節點,則不能直接刪除
  6. 先判斷當前節點的左子節點是否為空,如果不為空並判斷該左子節點是不是需要刪除的節點,如果是,則直接刪除,如果不是,再判斷當前節點的右子節點是否為空,如果不為空,再判斷該右子節點是不是需要刪除的節點,如果是,則直接刪除,如果不是,向左向右遞歸查找下一個節點
  7. 注意向左向右遞歸時依舊要判斷左子樹和右子樹是否為空,如果不判斷就會出現空指針異常的情況
  8. 源碼見下

源碼及分析

節點類方法
//刪除節點

    /**
     *
     * @param no 要刪除的節點編號
     */
    public void delNode(int no){
        //判斷當前節點的左子樹是否為空,如果不為空,再判斷是否為要刪除的節點
        if (this.left != null && this.left.no == no){
            this.left = null;
        }
        //判斷當前節點的右子樹是否為空,如果不為空,再判斷是否為要刪除的節點
        if (this.right != null && this.right.no == no){
            this.right = null;
        }
        //否則向左向右遞歸
        if (this.left != null){
            this.left.delNode(no);
        }
        if (this.right != null){
            this.right.delNode(no);
        }
    }
二叉樹類方法實現
//刪除節點

    /**
     *
     * @param no 要刪除的節點編號
     */
    public void delNode(int no){
        //先判斷二叉樹是否為空
        if (this.root != null){
            //再判斷當前root節點是不是要刪除的節點
            if (this.root.getNo() == no){
                root = null;
            }else {
                this.root.delNode(no);
            }
        }else {
            System.out.println("二叉樹為空,不能刪除...");
        }

    }


免責聲明!

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



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