二叉樹刪除節點詳解
說明
- 二叉樹刪除節點,如果刪除的是葉子節點,則找到后直接刪除,如果是非葉子節點,則刪除該子樹
- 因為沒有針對某種特定的二叉樹,因此沒有考慮如果是非葉子節點,只刪除該節點的情況
- 刪除節點思路
- 先判斷該二叉樹是否為空,如果不為空,則判斷該二叉樹的根節點是不是需要刪除的節點,如果是,則直接刪除並返回,如果不是,則遞歸查找根節點的左子樹和右子樹,找到則刪除
- 因為二叉樹是單向指向的,因此如果要刪除某個節點,必須找到該節點的上一個節點,如果直接找到要刪除的節點,則不能直接刪除
- 先判斷當前節點的左子節點是否為空,如果不為空並判斷該左子節點是不是需要刪除的節點,如果是,則直接刪除,如果不是,再判斷當前節點的右子節點是否為空,如果不為空,再判斷該右子節點是不是需要刪除的節點,如果是,則直接刪除,如果不是,向左向右遞歸查找下一個節點
- 注意向左向右遞歸時依舊要判斷左子樹和右子樹是否為空,如果不判斷就會出現空指針異常的情況
- 源碼見下
源碼及分析
節點類方法
//刪除節點
/**
*
* @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("二叉樹為空,不能刪除...");
}
}