Remove Node in Binary Search Tree

来源:互联网 发布:霹雳知乎 编辑:程序博客网 时间:2024/06/05 08:28

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的左子树赋给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;        }    }};
0 0