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
Solution
According to the number of its children, we should consider three different cases (video):
If the target node has no child, we can simply remove the node.
If the target node has one child, we can use its child to replace itself.
If the target node has two children, replace the node with its in-order successor or predecessor node and delete that node.
Iterative solution.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
private TreeNode deleteRootNode(TreeNode root) {
if (root == null) {
return null;
}
if (root.left == null) {
return root.right;
}
if (root.right == null) {
return root.left;
}
TreeNode next = root.right;
TreeNode pre = null;
for(; next.left != null; pre = next, next = next.left);
next.left = root.left;
if(root.right != next) {
pre.left = next.right;
next.right = root.right;
}
return next;
}
public TreeNode deleteNode(TreeNode root, int key) {
TreeNode cur = root;
TreeNode pre = null;
while(cur != null && cur.val != key) {
pre = cur;
if (key < cur.val) {
cur = cur.left;
} else if (key > cur.val) {
cur = cur.right;
}
}
if (pre == null) {
return deleteRootNode(cur);
}
if (pre.left == cur) {
pre.left = deleteRootNode(cur);
} else {
pre.right = deleteRootNode(cur);
}
return root;
}
}
Recursive solution.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
/**
* findSuccesor - Helper function for finding successor
* In BST, succesor of root is the leftmost child in root's right subtree
*/
private TreeNode findSuccessor(TreeNode root) {
TreeNode cur = root.right;
while (cur != null && cur.left != null) {
cur = cur.left;
}
return cur;
}
public TreeNode deleteNode(TreeNode root, int key) {
// return null if root is null
if (root == null) {
return root;
}
// delete current node if root is the target node
if (root.val == key) {
// replace root with root->right if root->left is null
if (root.left == null) {
return root.right;
}
// replace root with root->left if root->right is null
if (root.right == null) {
return root.left;
}
// replace root with its successor if root has two children
TreeNode p = findSuccessor(root);
root.val = p.val;
root.right = deleteNode(root.right, p.val);
return root;
}
if (root.val < key) {
// find target in right subtree if root->val < key
root.right = deleteNode(root.right, key);
} else {
// find target in left subtree if root->val > key
root.left = deleteNode(root.left, key);
}
return root;
}
}