Remove Node in Binary Search Tree

Remove Node in Binary Search Tree -1.png

Remove Node in Binary Search Tree -2.png

解題思路 :

首先要先找到想移除的點 利用比較 target 跟當(dāng)前檢查的 node value 比較 較大就往右子樹找 較小就往左子樹 直到找到為止 一旦找到之後 有三種可能狀況:

  1. 要移除的點沒有 left child : 如此只要回傳 right child 來連接移除點的 parent
  2. 要移除的點沒有 right child : 如此只要回傳 left child 來連接移除點的 parent
    (如果兩邊都沒有 child 怎麼辦? 那會符合 1, 2 其中一項 回傳另一邊 但是另一邊還是 nullptr 所以回傳值就是 nullptr 等於刪掉此點)
  3. 兩邊都有 child 則找到右邊子樹的最小數(shù)值那點 ( right child 的最左下子孫 ) 把此點的數(shù)值跟要刪除的點互換 然後要繼續(xù) recursive 往 right child 跑去把換掉的點殺掉

最後再回傳剛剛換過數(shù)值的點( 原本要刪除的點) 即可

C++ code :

<pre><code>
/**

  • Definition of TreeNode:
  • class TreeNode {
  • public:
  • int val;
    
  • TreeNode *left, *right;
    
  • TreeNode(int val) {
    
  •     this->val = val;
    
  •     this->left = this->right = NULL;
    
  • }
    
  • }
    */

class Solution {

public:

/**
 * @param root: The root of the binary search tree.
 * @param value: Remove the node with given value.
 * @return: The root of the binary search tree after removal.
 */
 
TreeNode* findMini(TreeNode *root)
{
    TreeNode *tmp = root;
    while(tmp->left)
    {
        tmp = tmp->left;
    }
    return tmp;
}

TreeNode* removeNode(TreeNode* root, int value) {
    // write your code here
    if(root == nullptr) return root;
    if(value > root->val) root->right = removeNode(root->right, value);
    else if(value < root->val) root->left = removeNode(root->left, value);
    else{
        if(!root->left) return root->right;
        if(!root->right) return root->left;
        TreeNode *minNode = findMini(root->right);
        int remove_val = root->val;
        root->val = minNode->val;
        minNode->val = remove_val;
        root->right = removeNode(root->right, value);
    }
    return root;
}

};

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

相關(guān)閱讀更多精彩內(nèi)容

  • 原題 給定一棵具有不同節(jié)點值的二叉查找樹,刪除樹中與給定值相同的節(jié)點。如果樹中沒有相同值的節(jié)點,就不做任何處理。你...
    Jason_Yuan閱讀 335評論 0 0
  • Remove Node in Binary Search Tree 今天是一道題目,來自LintCode,難度為H...
    ab409閱讀 908評論 0 0
  • 為何叫做 shell ? shell prompt(PS1) 與 Carriage Return(CR) 的關(guān)系?...
    Zero___閱讀 3,331評論 3 49
  • 在家里休息了兩天,原本說著和朋友一起看電影,還有以前幾個同學(xué)的聚會都無疾而終了。 原本幾個同學(xué)說好的聚會被突如其來...
    葉二閱讀 152評論 0 0
  • 今天是2017年9月1日,對于我來說是個嶄新的開始。為什么這么說呢?因為,有兩件事情同時在今天發(fā)生。第一件,我親愛...
    玥玥粑粑閱讀 573評論 2 0

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