給定乙個二叉搜尋樹的根節點 root 和乙個值 key,刪除二叉搜尋樹中的 key 對應的節點,並保證二叉搜尋樹的性質不變。返回二叉搜尋樹(有可能被更新)的根節點的引用。
示例:
問題分析
二叉搜尋樹的特點是左子樹的值都比他小,右子樹的值都比他大,刪除乙個節點之後我們還要保證二叉搜尋樹的這個特點不變。如果要刪除乙個結點,我們先要找到這個節點,然後才能刪除,但這裡要分幾種情況。
這裡使用遞迴的方式是最容易理解的,我們來看下**
public treenode deletenode
(treenode root,
int key)
else
if(key > root.val)
else
return root;
}// 找右子樹的最小值
// private treenode findmin(treenode node)
//找左子樹的最大值
private treenode findmax
(treenode node)
上面節點刪除的時候我們使用左子樹的最大值或者右子樹的最小值替換都是可以的。其實我們還可以改一下,如果要刪除結點左右子樹只要有乙個為空,我們就返回另一棵子樹,如果都不為空,我們可以讓左子樹成為右子樹最小結點的左子樹或者讓右子樹成為左子樹最大結點的右子樹,我們來看下**。
public treenode deletenode
(treenode root,
int key)
else
if(root.val < key)
else
return root;
}
總結刪除結點的時候並不一定要直接刪除,在之前講378,資料結構-7,堆的時候刪除結點直接使用其他節點來替換掉要刪除的結點即可。這裡也是使用同樣的方式,對於二叉搜尋樹節點的刪除,我們可以用它左子樹的最大值或者右子樹的最小值來替換,如果沒有左子樹或者右子樹那就更方便了。
二叉搜尋樹 刪除二叉搜尋樹中的節點
這裡就把平衡二叉樹中刪除節點遇到的情況都搞清楚。第一種情況 沒找到刪除的節點,遍歷到空節點直接返回了 找到刪除的節點 第二種情況 左右孩子都為空 葉子節點 直接刪除節點,返回null為根節點 第三種情況 刪除節點的左孩子為空,右孩子不為空,刪除節點,右孩子補位,返回右孩子為根節點 第四種情況 刪除節...
刪除二叉搜尋樹中的節點
刪除二叉搜尋樹中的節點 class solution cur left root left 把要刪除的結點root左子樹放在cur的左孩子位置 treenode tmp root 把root結點儲存一下,下面去刪除 root root right 返回舊root的右孩子作為新root delete ...
二叉搜尋樹 刪除節點
前幾天寫了簡單的二叉排序樹的實現,僅僅提供了插入和查詢操作,沒有寫刪除給定節點操作。現在補充過來,不過這個代價似乎太大了點 二叉排序樹的刪除操作主要有兩點要注意 1 必須修改的是刪除節點父節點的資訊 2 有四種情況需要考慮 刪除節點有無左右子樹的 4個組合 再加上一點就是要細心,考慮各種情況,例如根...