首页 > 其他分享 >刷刷刷 Day 22 | 450. 删除二叉搜索树中的节点

刷刷刷 Day 22 | 450. 删除二叉搜索树中的节点

时间:2023-01-25 23:35:09浏览次数:61  
标签:删除 22 450 树中 右子 为父 null root 节点

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

LeetCode题目要求

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

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

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

图

示例

输入:root = [5,3,6,2,4,null,7], key = 3
输出:[5,4,6,2,null,null,7]
解释:给定需要删除的节点值是 3,所以我们首先找到 3 这个节点,然后删除它。
一个正确的答案是 [5,4,6,2,null,null,7], 如上图所示。
另一个正确答案是 [5,2,6,null,4,null,7]。
解题思路

由于是删除节点操作,删除后还需要保证是一个二叉搜索树。

  1. 如果删除的是叶子节点,那么不需要又任何变化,直接删除即可
  2. 如果是非叶子节点,存在左右子树,将右子树升级为父结点
  3. 如果是非叶子节点,只存在左子树,那么左子树升级为父结点
  4. 如果是非叶子节点,只存在右子树,那么右子树升级为父节点

上代码

class Solution {
    public TreeNode deleteNode(TreeNode root, int key) {
        /**
        1. 如果删除的是叶子节点,那么不需要又任何变化,直接删除即可
        2. 如果是非叶子节点,存在左右子树,将右子树升级为父结点
        3. 如果是非叶子节点,只存在左子树,那么左子树升级为父结点
        4. 如果是非叶子节点,只存在右子树,那么右子树升级为父节点
        */

        if (root == null) {
            return root;
        }

        if (root.val == key) {
            if (root.left == null && root.right == null) {
                return null;
            } else if (root.left == null) {
                return root.right;
            } else if (root.right == null) {
                return root.left;
            } else {
                TreeNode node = root.right;
                while (node.left != null) {
                    node = node.left;
                }
                node.left = root.left;
                root = root.right;
                return root;
            }
        }

        //  往左子树遍历
        if (root.val > key) {
            root.left = deleteNode(root.left, key);
        }
        // 往右子树遍历
        if (root.val < key) {
            root.right = deleteNode(root.right, key);
        }
        return root;
    }
}
重难点

搞明白以下集中情况, 并结合二叉搜索树的特点

  1. 如果删除的是叶子节点,那么不需要又任何变化,直接删除即可
  2. 如果是非叶子节点,存在左右子树,将右子树升级为父结点
  3. 如果是非叶子节点,只存在左子树,那么左子树升级为父结点
  4. 如果是非叶子节点,只存在右子树,那么右子树升级为父节点
    附:学习资料链接

标签:删除,22,450,树中,右子,为父,null,root,节点
From: https://www.cnblogs.com/blacksonny/p/17067436.html

相关文章

  • 2021-2022年部分个人作品一览
    2021-2022年部分模型截图              ---------------------------------------------------------------------------------------......
  • 刷刷刷 Day 22 | 701. 二叉搜索树中的插入操作
    701.二叉搜索树中的插入操作LeetCode题目要求给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树。返回插入后二叉搜索树的根节点。输入......
  • Windows 11 v22000.318 11月更新版
    Windows11商业版(含教育版、企业版、专业版、专业教育版、专业工作站版)SHA-256:08FB80412CF7239D7135066A6D4EA604359DBCCBAF481C51EEE08749D81590AEed2k://|file|zh-cn......
  • 刷刷刷 Day 22 | 235. 二叉搜索树的最近公共祖先
    235.二叉搜索树的最近公共祖先LeetCode题目要求给定一个二叉搜索树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个结......
  • 2022前端年底面试总结
    又到年底了,很多小伙伴又开始​​跳槽​​​了,本次汇总都是​​面试真题​​​,来自各位小伙伴有​​大厂​​​也有​​小厂​​​,还有​​外包​​可以说很全面了。某外包公......
  • USACO2022 OPEN【杂题】
    A.[USACO22OPEN]262144RevisitedP对于一个长为\(m\)的序列\(b\),如下定义其权值:对其进行\(m-1\)次操作,每次选择相邻的两个数合并,合并后将其替换为一个大于两数最......
  • 刷刷刷 Day 21 | 501. 二叉搜索树中的众数
    501.二叉搜索树中的众数LeetCode题目要求给你一个含重复值的二叉搜索树(BST)的根节点root,找出并返回BST中的所有众数(即,出现频率最高的元素)。如果树中有不止一个众数......
  • Codeforces Round #822 (Div. 2) D
    链接:https://codeforces.com/problemset/problem/1734/E题意,给定n,b[1~n],求一个nn矩阵,满足a[i][i]=b[i],且对于r1<r2,c1<c2,a[r1][c1]+a[r2][c2]!=a[r1][c2]+a[r2][c1](m......
  • 2022ISCTF Crypto wp
    ISCTFCryptowp1.这是什么古典玩意题目:Theflagis:ISCTF{part1_part2_part3}example:part1:aaapart2:bbbpart3:!@#flag:ISCTF{aaa_bbb_!@#}-----------------......
  • 【ARIXV2209】Multi-Scale Attention Network for Single Image Super-Resolution
    【ARIXV2209】Multi-ScaleAttentionNetworkforSingleImageSuper-Resolution代码:https://github.com/icandle/MAN这是来自南开大学的工作,将多尺度机制与大核注意机......