Leetcode 450. 刪除二叉搜索樹(shù)中的節(jié)點(diǎn)(BST的刪除問(wèn)題)

問(wèn)題描述

給定一個(gè)二叉搜索樹(shù)的根節(jié)點(diǎn) root 和一個(gè)值 key,刪除二叉搜索樹(shù)中的 key 對(duì)應(yīng)的節(jié)點(diǎn),并保證二叉搜索樹(shù)的性質(zhì)不變。返回二叉搜索樹(shù)(有可能被更新)的根節(jié)點(diǎn)的引用。
一般來(lái)說(shuō),刪除節(jié)點(diǎn)可分為兩個(gè)步驟:

  • 首先找到需要?jiǎng)h除的節(jié)點(diǎn);
  • 如果找到了,刪除它。

說(shuō)明: 要求算法時(shí)間復(fù)雜度為 O(h),h 為樹(shù)的高度。

Example

root = [5,3,6,2,4,null,7]
key = 3



給定需要?jiǎng)h除的節(jié)點(diǎn)值是 3,所以我們首先找到 3 這個(gè)節(jié)點(diǎn),然后刪除它。

一個(gè)正確的答案是 [5,4,6,2,null,null,7], 如下圖所示。

另一個(gè)正確答案是 [5,2,6,null,4,null,7], 如下圖所示。
image.png

題目鏈接:450. 刪除二叉搜索樹(shù)中的節(jié)點(diǎn) (難度:中等)

思路

從題目描述中可知,我們需要做的事情有兩個(gè):找到節(jié)點(diǎn)和刪除節(jié)點(diǎn)。我們考慮刪除當(dāng)前節(jié)點(diǎn)的情況:

  • 若當(dāng)前節(jié)點(diǎn)是葉節(jié)點(diǎn),則直接刪除
  • 若當(dāng)前節(jié)點(diǎn)的左右孩子中有一棵為空,則用另一個(gè)子樹(shù)代替當(dāng)前節(jié)點(diǎn)
  • 若當(dāng)前節(jié)點(diǎn)的左右孩子均非空,我們統(tǒng)一將左子樹(shù)作為根節(jié)點(diǎn),并將右子樹(shù)掛到左子樹(shù)的最右結(jié)點(diǎn)的右端

其中,第一種情況是第二種情況的特例

代碼

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root == NULL)
            return NULL;
        if(root->val == key){
            if(root->left && root->right){
                TreeNode* tmp = root->left;
                while(tmp->right){
                    tmp = tmp->right;
                }
                tmp->right = root->right;
                return root->left;
            }
            return root->right == NULL ? root->left : root->right;
        }else if(root->val < key){
            root->right = deleteNode(root->right, key);
        }else{
            root->left = deleteNode(root->left, key);
        }
        return root;
    }
};

執(zhí)行結(jié)果:64 ms,32.5 MB

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容