• Lintcode: Remove Node in Binary Search Tree


    iven 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.
    
    Have you met this question in a real interview? Yes
    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

    分析:假设当前node 为root

    1. if value < root.val, 要被删除的节点在左子树,往左子树递归,并把操作结束后的返回值作为新的root.left

    2. if value > root.val, 要被删除的节点在右子树,往右子树递归, 并把操作结束后的返回值作为新的root.right

    3. if root == null, 递归到了一个null点,说明要删的value不存在,return null,而这个null点的parent的相应子树本来也是null,对树的结构没有任何影响

    4. if value == root.val,说明root是该被删除的了

      A. if root.left == null, return root.right

      B. if root.right == null, return root.left(这两个case其实包含了只有一个child和一个child都没有的三种情况)

      C. 如果两个children都存在,从右子树中找最小的node,与root交换,再递归调用函数在右子树中删除root.val

     1 /**
     2  * Definition of TreeNode:
     3  * public class TreeNode {
     4  *     public int val;
     5  *     public TreeNode left, right;
     6  *     public TreeNode(int val) {
     7  *         this.val = val;
     8  *         this.left = this.right = null;
     9  *     }
    10  * }
    11  */
    12 public class Solution {
    13     /**
    14      * @param root: The root of the binary search tree.
    15      * @param value: Remove the node with given value.
    16      * @return: The root of the binary search tree after removal.
    17      */
    18     public TreeNode removeNode(TreeNode root, int value) {
    19         // write your code here
    20         if (root == null) return null;
    21         if (value < root.val)  
    22             root.left = removeNode(root.left, value);
    23         else if (value > root.val)
    24             root.right = removeNode(root.right, value);
    25         else {
    26             if (root.left == null) return root.right;
    27             if (root.right == null) return root.left;
    28             TreeNode minOfRight = findMin(root.right);
    29             //swap root and minOfRight
    30             int temp = root.val;
    31             root.val = minOfRight.val;
    32             minOfRight.val = temp;
    33             root.right = removeNode(root.right, minOfRight.val);
    34         }
    35         return root;
    36     }
    37     
    38     public TreeNode findMin(TreeNode cur) {
    39         while (cur.left != null) {
    40             cur = cur.left;
    41         }
    42         return cur;
    43     }
    44 }
  • 相关阅读:
    第一个java程序
    Java安装
    Maven安装
    Effective Java 3
    gateway + jwt 网关认证
    idea的使用
    线程池的使用
    服务注册发现Eureka
    zookeeperAPI的常用方法
    sss
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5100920.html
Copyright © 2020-2023  润新知