Remove Node in Binary Search Tree

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为树节点的个数。

posted on 2015-12-31 09:48  BillZ  阅读(482)  评论(0编辑  收藏  举报

导航