Remove Node in Binary Search Tree

Remove Node in Binary Search Tree -1.png

Remove Node in Binary Search Tree -2.png

解題思路 :

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

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

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

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;
}

};

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原题 给定一棵具有不同节点值的二叉查找树,删除树中与给定值相同的节点。如果树中没有相同值的节点,就不做任何处理。你...
    Jason_Yuan阅读 324评论 0 0
  • Remove Node in Binary Search Tree 今天是一道题目,来自LintCode,难度为H...
    ab409阅读 895评论 0 0
  • 为何叫做 shell ? shell prompt(PS1) 与 Carriage Return(CR) 的关系?...
    Zero___阅读 3,188评论 3 49
  • 在家里休息了两天,原本说着和朋友一起看电影,还有以前几个同学的聚会都无疾而终了。 原本几个同学说好的聚会被突如其来...
    叶二阅读 131评论 0 0
  • 今天是2017年9月1日,对于我来说是个崭新的开始。为什么这么说呢?因为,有两件事情同时在今天发生。第一件,我亲爱...
    玥玥粑粑阅读 538评论 2 0