leetcode450-删除二叉搜索树中的节点

原题

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

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

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

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

示例:

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

    5
   / \
  3   6
 / \    \
2   4   7

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

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

    5
   / \
  4   6
 /     \
2       7

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

    5
   / \
  2   6
   \   \
    4   7

解法

思想

删除一个节点,可以有三种情况:

  1. 它没有子节点,那么直接删除。
  2. 它拥有一个子节点,那么直接用子节点替换它
  3. 它有两个子节点,则可以:

将它的右子节点附在左子节点的最右边:

leetcode450-删除二叉搜索树中的节点

或,将它的左子节点附在右子节点的最左边:

leetcode450-删除二叉搜索树中的节点

实际就是让搜索树线性化,这样操作会让搜索树的高度逐渐失衡,所以并不推荐作为一个数据结构这样实现。

更好的删除方法可以参考官方题解: https://leetcode-cn.com/problems/delete-node-in-a-bst/solution/shan-chu-er-cha-sou-suo-shu-zhong-de-jie-dian-by-l/

代码

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        if(root == null) return null;
        if(root.val == key) {//根节点就是要删除的节点
            if(root.left==null && root.right==null) return null;
            else if(root.left!=null){
                TreeNode node = root.left;
                while(node.right!=null){
                    node = node.right;
                }
                node.right = root.right;
                return root.left;
            }else return root.right;
        }
        if(root.left!=null&&root.left.val==key){//左子节点是要删除的节点
            if(root.left.left==null && root.left.right==null) root.left = null;
            else if(root.left.left!=null){
                TreeNode node = root.left.left;
                while(node.right!=null){
                    node = node.right;
                }
                node.right = root.left.right;
                root.left = root.left.left;
            }else root.left = root.left.right;
        }else if(root.right!=null&&root.right.val==key){//右子节点是要删除的节点
            if(root.right.left==null && root.right.right==null) root.right = null;
            else if(root.right.right!=null){
                TreeNode node = root.right.right;
                while(node.left!=null){
                    node = node.left;
                }
                node.left = root.right.left;
                root.left = root.right.right;
            }else root.right = root.right.left;
        }else {
            deleteNode(root.left,key);
            deleteNode(root.right,key);
        }
        return root;
    }
}

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/leetcode450-%e5%88%a0%e9%99%a4%e4%ba%8c%e5%8f%89%e6%90%9c%e7%b4%a2%e6%a0%91%e4%b8%ad%e7%9a%84%e8%8a%82%e7%82%b9/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年1月16日
下一篇 2020年1月17日

相关推荐

  • 蓝桥杯试题-哈夫曼树

    原题 Description Huffman树在编码中有着广泛的应用。在这里,我们只关心Huffman树的构造过程。 给出一列数{pi}={p0, p1, …, pn-1},用这列…

    算法 2020年3月1日
    0250
  • 剑指offer05-替换空格

    原题(来源Leetcode) 请实现一个函数,把字符串 s 中的每个空格替换成"%20"。 示例1: 输入: s = "We are happy." 输出: "We%20are%2…

    算法 2020年4月5日
    0110
  • leetcode146-LRU缓存机制

    原题 运用你所掌握的数据结构,设计和实现一个  LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) -…

    算法 2020年5月25日
    0100
  • leetcode454-四数相加II

    原题 给定四个包含整数的数组列表 A , B , C , D ,计算有多少个元组 (i, j, k, l) ,使得 A[i] + B[j] + C[k] + D[l] = 0。 为…

    算法 2019年12月27日
    080
  • leetcode589-N叉树的前序遍历

    原题 给定一个 N 叉树,返回其节点值的前序遍历。 例如,给定一个 3叉树 : 返回其前序遍历: [1,3,5,6,2,4]。 说明: 递归法很简单,你可以使用迭代法完成此题吗? …

    2020年1月19日
    01030
  • leetcode202-快乐数

    原题 编写一个算法来判断一个数是不是“快乐数”。 一个“快乐数”定义为:对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和,然后重复这个过程直到这个数变为 1,也可能是无…

    算法 2019年12月18日
    0120
  • leetcode1160-拼写单词

    原题 给你一份『词汇表』(字符串数组) words 和一张『字母表』(字符串) chars。 假如你可以用 chars 中的『字母』(字符)拼写出 words 中的某个『单词』(字…

    算法 2020年3月17日
    0130
  • 剑指offer17-打印从1到最大的n位数

    原题(来源Leetcode) 输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。 示例 1: 输入: …

    算法 2020年4月17日
    080
  • leetcode704-二分查找

    原题 给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。 示…

    算法 2019年12月29日
    080
  • 程序员面试金典08.11-硬币

    原题(来源Leetcode) 硬币。给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。(结果可能会很大,你需要将结果模上1000000007) 示…

    算法 2020年4月23日
    0180

发表回复

登录后才能评论