Lintcode 87. Remove Node in Binary Search Tree

Given a root of Binary Search Tree with unique value for each node. Remove the node with given value. If there is no such a node with given value in the binary search tree, do nothing. You should keep the tree still a binary search tree after removal.

设找到的需要删除的节点为node  
- 如果node的右子树为空,直接将node的左子树赋给node的parent节点; 
- 如果node的右子树不为空,则需要找一个node的后继(即在右子树中找一个值最小的节点)替换node; 
- 如果找不到node则返回root;

技巧: 
因为要删除的节点可能是根节点,因此为了算法的通用性,可以首先new一个dummy节点,该节点的左节点指向根节点,这样处理起来更为方便。

/**
 * 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* removeNode(TreeNode* root, int value) {
        // write your code here
        if(!root){
            return root;
        }

        TreeNode* dummy =new TreeNode(0);
        dummy->left=root;

        TreeNode* parent=findNode(dummy,root,value);

        TreeNode* node;
        if(parent->left && parent->left->val==value){
            node=parent->left;
        }else if(parent->right && parent->right->val==value){
            node=parent->right;
        }else{
            return dummy->left;//没有找到的情况
        }

        deleteNode(parent,node);

        return dummy->left;
    }

    TreeNode* findNode(TreeNode* parent,TreeNode* node,int val){

        if(node==NULL){
            return parent;
        }

        if(node->val==val){
            return parent;
        }

        if(node->val<val){
            return findNode(node,node->right,val);
        }else{
            return findNode(node,node->left,val);
        }
    }

    void deleteNode(TreeNode* parent,TreeNode* node){

        if(node->right==NULL){
            if(parent->left==node){
                parent->left=node->left;
            }else{
                parent->right=node->left;
            }
        }else{
            TreeNode* father=node;
            TreeNode* minNode=node->right;

            while(minNode->left){
                father=minNode;
                minNode=minNode->left;
            }

            //这里容易出错
            if(father->left==minNode){
                father->left=minNode->right;
            }else{
                father->right=minNode->right;
            }


            if(parent->left==node){
                parent->left=minNode;
            }else{
                parent->right=minNode;
            }

            minNode->left=node->left;
            minNode->right=node->right;

        }

    }

};

猜你喜欢

转载自blog.csdn.net/vanturman/article/details/80286771