450. Delete Node in a BST
Medium
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:
1) If the node is leaf, just remove this node, remove the connection between its parent and this node.
2) If the node has one child, replace this node with its child. connect its parent with its child. root's parent's left or right point to root's left or right.(which is point to the root originally)
3) If the node has two child, find min value in the right subtree. ( which is inorder successor of the node, the mostleft node of the right subtree). replace the root value with min value. delete the min value node from right subtree.(which can call deleteNode recursively).
this important thing is that the inorder successor can be obtained only when the right subtree is not empty.
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public TreeNode deleteNode(TreeNode root, int key) {
if(root == null) return root;
if(key < root.val){
root.left = deleteNode(root.left,key);
}else if(key > root.val){
root.right = deleteNode(root.right,key);
}else{
if(root.left == null){
return root.right;
}else if(root.right == null){
return root.left;
}
int minKey = findMin(root.right);
root.val = minKey;
root.right = deleteNode(root.right,minKey);
}
return root;
}
public int findMin(TreeNode root){
int min = root.val;
while(root.left!=null){
min = root.left.val;
root = root.left;
}
return min;
}
}
Comments
Post a Comment