本節任務:
如果刪除的節點是葉子節點,則刪除該節點
如果刪除的節點是非葉子節點,則刪除該子樹
測試刪除5號葉子節點和3號子樹
思路**:
規定:如果刪除的節點是葉子節點,則刪除該節點。
如果刪除的節點是非葉子節點,則刪除該子樹。
把判斷root的邏輯寫在binarytree二叉樹的刪除方法裡,然後遞迴的邏輯寫在heronode節點的刪除方法裡。
思路:首先處理:
考慮如果樹是空樹,和如果只有乙個root節點,則等價於將二叉樹置空。
public
void
delnode
(int no)
else
}else
}
然後進行下面的步驟:
因為我們的二叉樹是單向的,所以我們是判斷當前結點的子結點是否需要刪除,而不能去判斷當前這個結點是不是需要刪除的
如果當前結點的左子結點不為空,並且左子結點就是要刪除結點,就將this.left=null;並且就返回(結束遞迴刪除)
如果當前結點的右子結點不為空,並且右子結點就是要刪除結點,就將this. right=null;並且就返回(結束遞迴刪除)
如果第2和第3步沒有刪除結點,那麼我們就需要向左子樹進行遞迴刪除
如果第4步也沒有刪除結點,則應當向右子樹進行遞迴刪除
public
void
delnode
(int no)
// 3.如果當前結點的右子結點不為空,並且右子結點就是要刪除結點,就將this. right=null;並且就返回(結束遞迴刪除)if(
this
.right != null &&
this
.right.no == no)
// 4.如果第2和第3步沒有刪除結點,那麼我們就需要向左子樹進行遞迴刪除if(
this
.left != null)
// 5.如果第4步也沒有刪除結點,則應當向右子樹進行遞迴刪除if(
this
.right != null)
}
測試:
流程(以刪除5號節點為例):
首先,在樹類中,判斷根節點不是空的,並且根節點的編號1不是需要刪除的,所以進入heronode裡的遞迴刪除。
其次,進入節點類中的刪除方法。進入乙個判斷:根節點的左子節點不為空,且左子節點的編號2不是要找的編號5,退出本次判斷。
進入下乙個判斷,上面兩個操作都沒有刪除節點,且2號(根節點的左子節點)不為空,於是進入其左遞迴刪除。進入遞迴後,判斷2號的左子節點為空,又判斷2號的右子節點為空。所以本次遞迴,四個判斷條件乙個都沒滿足,退出根節點左子樹的遞迴刪除。
進入根節點右子樹的遞迴刪除。先判斷其左子節點不為空 且 左子節點的編號5就是要刪除的節點編號5,直接刪除(置空)該節點後,return.
二叉樹刪除結點
二叉樹完成刪除結點的操作.規定 1 如果刪除的節點是葉子節點,則刪除該節點 2 如果刪除的節點是非葉子節點,則刪除該子樹 思路首先先處理 考慮如果樹是空樹root,如果只有乙個root結點,則等價將二叉樹置空 然後進行下面步驟 1.因為我們的二叉樹是單向的,所以我們是判斷當前結點的子結點是否需要刪除...
資料結構與演算法(十三)刪除二叉樹結點
刪除二叉樹結點 刪除結點是二叉樹操作中最複雜的。在刪除之前首先要查詢要刪除的結點。找到結點後,這個要刪除的結點可能會有三種情況需要考慮。1.該節點是葉子結點,沒有子結點 要刪除葉子結點,只需要改變該節點的父結點的引用值,將指向該節點的引用值設定為null就可以了。2.該節點有乙個子結點 改變父結點的...
資料結構筆記 樹 二叉樹 滿二叉樹
二叉樹滿二叉樹 樹是n n 0 個結點的有限集。結點為零的樹為空樹。任意一棵非空樹中 1.有且有乙個特定的稱為根的結點 2.當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每乙個集合又是一棵樹,並稱為根的子樹。1.結點擁有的子樹數稱為結點的度 2.度為0的結點稱為葉結點或分支結點,除根...