标签:
Question:
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.
Example:
Given binary search tree:
5
/ \
3 6
/ \
2 4
Remove 3, you can either return:
5
/ \
2 6
\
4
or :
5
/ \
4 6
/
2
Analysis:
分三种情况考虑。
Case 1: 当目标节点是叶子节点,简单删去即可。
Case 2: 当目标节点只有左(右)子树,将目标节点的父节点和目标节点的左(右)子树相连。
Case 3: 当目标节点有左右子树,首先找到右子树中拥有最小值的节点(右子树中最靠左的子节点),然后将该最小值赋值给目标节点,最后删去这个拥有最小值的节点。
用递归可以清晰简洁地实现这个算法。
Code:
1 public class Solution { 2 /** 3 * @param root: The root of the binary search tree. 4 * @param value: Remove the node with given value. 5 * @return: The root of the binary search tree after removal. 6 */ 7 public TreeNode removeNode(TreeNode root, int value) { 8 if(root == null) { 9 return null; 10 } 11 12 if(root.val > value) { 13 root.left = removeNode(root.left, value); 14 }else if(root.val < value) { 15 root.right = removeNode(root.right, value); 16 }else { 17 // case 1: 叶子节点 18 if(root.left == null && root.right == null) { 19 root = null; 20 // case 2: 只有一个子树 21 }else if(root.left == null) { 22 root = root.right; 23 }else if(root.right == null) { 24 root = root.left; 25 // case 3: 有两个子树 26 }else { 27 TreeNode temp = findMin(root.right); //找到右子树种的最小值 28 root.val = temp.val; 29 root.right = removeNode(root.right, temp.val); 30 } 31 } 32 return root; 33 } 34 35 TreeNode findMin(TreeNode root) { 36 while(root.left != null) { 37 root = root.left; 38 } 39 return root; 40 } 41 }
Complexity:
时间复杂度为O(n),n为树节点的个数。
Remove Node in Binary Search Tree
标签:
原文地址:http://www.cnblogs.com/billzhou0223/p/5090759.html