給定乙個二叉搜尋樹的根節點root和乙個值key,刪除二叉搜尋樹中的key對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹(有可能被更新)的根節點的引用。
一般來說,刪除節點可分為兩個步驟:
首先找到需要刪除的節點;
如果找到了,刪除它。
說明: 要求演算法時間複雜度為 o(h),h 為樹的高度。
示例:
root =[8
,5,6
,3,7
,null,9]
key =58
/ \ 5
6/ \ \37
9給定需要刪除的節點值是 5,所以我們首先找到 5 這個節點,然後刪除它。
乙個正確的答案是 [8,
7,6,
3,null,null,9]
, 如下圖所示。
8/ \ 7
6/ \39
另乙個正確答案是 [8,
3,6,null,
7,null,9]。
8/ \ 3
6 \ \79
思路
step1:假如沒有子節點,直接刪除
step2:假如要刪除的節點只有乙個子節點,那麼刪除節點後,就用這個子節點替換
step3:假如要刪除的節點有兩個子節點,那麼從刪除節點的右分支查詢最小值,將其要刪除的節點替換
來,直接上**:
public
class
treenode
}
class
solution
if(key < root.val)
else
if(key > root.val)
else
else
root.val = cur.val;
root.right =
deletenode
(root.right,cur.val);}
}return root;
}}
先用暫時能想到的粗鄙的方式給樹賦值,然後咱們開始debug
public
static
void
main
(string[
] args)
首先,root.val的值是8,小於key的值5,進入迭代
這個時候,root.val就是5了,這時候就進入下乙個分支,首先判斷是否有子分支,這時候的判斷是有子分支的,然後我們這裡判斷右分支是否有左分支,如果有的話要繼續迭代,沒有的話那麼我們就將右分支的值覆蓋要刪除的值,可以看到這時候,我們的右分支就替代了原來的要刪除的位置。
但是右分支有個7,發現沒有刪除,那麼我們就要來操作右分支,繼續往下迭代,
重新走到這一步,發現沒有子分支了,那麼就會給他乙個null。這時候,順序就對上了。跟著這個思路走,可以理清操作流程。
當對這類題目有了明確的思路,可以自己走得通流程圖,那麼就不需要通過這種方式來理解,可以通過自己的思路,去更好的**這些題目。
希望可以幫到你!
二叉搜尋樹 刪除二叉搜尋樹中的節點
這裡就把平衡二叉樹中刪除節點遇到的情況都搞清楚。第一種情況 沒找到刪除的節點,遍歷到空節點直接返回了 找到刪除的節點 第二種情況 左右孩子都為空 葉子節點 直接刪除節點,返回null為根節點 第三種情況 刪除節點的左孩子為空,右孩子不為空,刪除節點,右孩子補位,返回右孩子為根節點 第四種情況 刪除節...
二叉搜尋樹的刪除 二叉樹 搜尋樹中的刪除操作
二叉搜尋樹刪除節點就涉及到結構調整了。給定乙個二叉搜尋樹的根節點 root 和乙個值 key,刪除二叉搜尋樹中的 key 對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹 有可能被更新 的根節點的引用。一般來說,刪除節點可分為兩個步驟 首先找到需要刪除的節點 如果找到了,刪除它。說明 要求演算...
二叉搜尋樹 二叉搜尋樹的刪除操作
如圖刪除 7,4,2直接刪除接可以 如圖 刪除6把7拉上去 如圖 刪除3 4沒有左孩子直接返回4 所以最後的結果只是4覆蓋3 上 class solution if key root.val else if key root.val else else if root.right null else...