Leetcode: Delete Node in a BST
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
recursively find the node that needs to be deleted
Once the node is found, have to handle the below 4 cases
- node doesn't have left nor right - return null
- node only has left subtree- return the left subtree
- node only has right subtree- return the right subtree
- node has both left and right - find the minimum value in the right subtree, set that value to the currently found node, then recursively delete the minimum value in the right subtree
1 /** 2 * Definition for a binary tree node. 3 * public class TreeNode { 4 * int val; 5 * TreeNode left; 6 * TreeNode right; 7 * TreeNode(int x) { val = x; } 8 * } 9 */ 10 public class Solution { 11 public TreeNode deleteNode(TreeNode root, int key) { 12 if (root == null) return null; 13 if (key < root.val) { 14 root.left = deleteNode(root.left, key); 15 } 16 else if (key > root.val) { 17 root.right = deleteNode(root.right, key); 18 } 19 else { //k == root.val 20 if (root.left == null) return root.right; 21 else if (root.right == null) return root.left; 22 else { // both root.left and root.right are not null 23 TreeNode minRight = findMin(root.right); 24 root.val = minRight.val; 25 root.right = deleteNode(root.right, minRight.val); 26 } 27 } 28 return root; 29 } 30 31 public TreeNode findMin(TreeNode cur) { 32 while (cur.left != null) { 33 cur = cur.left; 34 } 35 return cur; 36 } 37 }