1. 程式人生 > 其它 >二叉樹刪除結點

二叉樹刪除結點

二叉樹刪除節點

1)若果刪除的節點是葉子節點,則刪除該節點
2)如果刪除的節點是非葉子節點,則刪除該樹

思路:
1.如果這個樹是空樹,如果只有root結點,則等價於將二叉樹置空
2.所以,我們是判斷當前節點的子結點是否是需要刪除的節點,而不能去判斷當前這個結點是不是需
要刪除的結點
3.如果當前節點的左子結點不為空,並且左子節點就是要刪除的結點,就將this.left=null
4.如果當前節點的右子結點不為空,並且右子節點就是要刪除的結點,就將this.right=null
5.如果第二步第三步都沒有刪除結點,我們就需要向左子樹進行遞迴刪除
6.如果第四步都沒有刪除這個結點就向右子樹進行遞迴刪除

程式碼實現

HeroNode中的方法
	//遞迴刪除結點
    //如果刪除的結點是葉子結點,則刪除該結點
    //如果刪除的結點是非葉子結點,則刪除該樹
    public void delNode(int no){
        //3.如果當前節點的左子結點不為空,並且左子節點就是要刪除的結點,就將this.left=null
        if (this.left!=null&&this.left.no==no){
            this.left=null;
            return;
        }
        //4.如果當前節點的右子結點不為空,並且右子節點就是要刪除的結點,就將this.right=null
        if (this.right!=null&&this.right.no==no){
            this.right=null;
            return;
        }
        //5.如果第二步第三步都沒有刪除結點,我們就需要向左子樹進行遞迴刪除
        if (this.left!=null){
            this.left.delNode(no);
        }
        //6.如果第四步都沒有刪除這個結點就向右子樹進行遞迴刪除
        if (this.right!=null){
            this.right.delNode(no);
        }

    }

BinaryTree中的程式碼
	//刪除結點
    public void delNode(int no){
        if (root!=null){
            //這裡就要立即判斷root是不是要刪除的結點
            if (root.getNo()==no){
                root=null;
            }else {
                root.delNode(no);
            }
        }else{
            System.out.println("空樹不能刪除");
        }
    }
    
但是這樣刪除二叉樹,如果刪除左邊節點還是會在右邊節點遞迴一遍