Given a root node reference of a BST and a key, delete the node with the given key in the BST. Return the root node reference (possibly updated) of the BST.
Basically, the deletion can be divided into two stages:
- Search for a node to remove.
- If the node is found, delete the node.
Note: Time complexity should be O(height of tree).
Example:
root = [5,3,6,2,4,null,7] key = 3 5 / \ 3 6 / \ \ 2 4 7 Given key to delete is 3. So we find the node with value 3 and delete it. One valid answer is [5,4,6,2,null,null,7], shown in the following BST. 5 / \ 4 6 / \ 2 7 Another valid answer is [5,2,6,null,4,null,7]. 5 / \ 2 6 \ \ 4 7
class Solution {
public:
TreeNode* deleteNode(TreeNode* root, int key) {
TreeNode * pre = NULL;
TreeNode * cur = root;
while(cur)
{
if(cur->val==key) break;
pre = cur;
if(cur->val>key) cur = cur->left;
else cur = cur->right;
}
if(!cur) return root;
if(!pre) return del(cur);
if(pre->left&&pre->left->val==key) pre->left = del(cur);
else pre->right = del(cur);
return root;
}
TreeNode *del(TreeNode *node)
{
if(!node->left&&!node->right) return NULL;
if(!node->left || !node->right)
{
return node->left ? node->left : node->right;
}
TreeNode * cur = node->right;
TreeNode * pre = node;
while(cur->left)
{
pre = cur;
cur = cur->left ;
}
node->val = cur->val;
( node == pre ? node->right : pre->left )= cur->right ;
return node;
}
};