• 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 }
  • 相关阅读:
    Maven核心简析
    块/文件/对象存储对比性概述
    Java SE-基本数据类型对应包装类
    Maven+eclipse快速入门
    IaaS、PaaS、SaaS、CaaS、MaaS五者的区别
    Collections.shuffle()源码分析
    java集合继承关系图
    ArrayList和LinkedList的区别
    ArrayList的实现原理
    session以及分布式服务器session共享
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/6178813.html
Copyright © 2020-2023  润新知