• Leetcode 450.删除二叉搜索树的节点


    删除二叉搜索树的节点

    给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。

    一般来说,删除节点可分为两个步骤:

    1. 首先找到需要删除的节点;
    2. 如果找到了,删除它。

    说明: 要求算法时间复杂度为 O(h),h 为树的高度。

    示例:

    root = [5,3,6,2,4,null,7]

    key = 3

    给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。

    一个正确的答案是 [5,4,6,2,null,null,7], 如下图所示。

    另一个正确答案是 [5,2,6,null,4,null,7]。

     

    解题思想

    现在有一个二叉搜索树,现在要让你删除一个节点,并且保证整个BST的性质不变。

    要保证整个性质,我们必须在删除的位置上,找一个合适的值来进行替换,使得BST上的每个节点都满足 当前节点的值大于左节点但是小于右节点

    而替换策略就是:

    1、当前删除位置,用左边子树的最大值的节点替换

    2、或者是,用右边子树的最小值的节点替换

    用上面的策略就可以保证删除后性质不变,并且调整开销也很少

     1 class TreeNode {
     2     int val;
     3     TreeNode left;
     4     TreeNode right;
     5     TreeNode(int x) { val = x; }
     6 }
     7 
     8 public class Solution {
     9      public int findReplacement(TreeNode parent,TreeNode node,boolean isLeft){
    10          if(node.right == null){
    11              if (isLeft) parent.left = node.left;
    12              else parent.right = node.left;
    13              return node.val;
    14          }
    15          return findReplacement(node,node.right,false);
    16      }
    17 
    18      public TreeNode deleteNode(TreeNode root, int key) {
    19          if(root==null) return null;
    20          if(root.val == key){
    21              if(root.left == null)
    22                  return root.right;
    23              if(root.right == null)
    24                  return root.left;
    25              root.val = findReplacement(root,root.left,true); // 选择左边最大的,或者右边最小的
    26          } else{
    27              if(root.val > key)
    28                  root.left = deleteNode(root.left,key);
    29              else root.right = deleteNode(root.right,key);
    30          }
    31          return root;
    32      }
    33 }
  • 相关阅读:
    我的2015技术学习流水账
    Java程序员的现代RPC指南
    我对读计算机软件专业硕士的几点看法
    Hadoop加速器GridGain
    BDD敏捷开发入门与实战
    openstack kilo部署-基础环境
    python学习之成员信息增删改查
    网站监控系统安装部署(zabbix,nagios)
    监控redis数据库应用状态:python,tornado实现
    python 远程执行命令、发布文件
  • 原文地址:https://www.cnblogs.com/kexinxin/p/10269842.html
Copyright © 2020-2023  润新知