【LeetCode450】Delete Node in BST二叉搜索树删除节点

删除二叉搜索树中的节点 在二叉搜索树中删除节点是一个常见的操作,我们需要保证删除节点后的树仍然满足二叉搜索树的性质。本文将介绍如何在二叉搜索树中删除节点的算法和实现。一个更简单理解的方法。 阅读详情

一、原题重现

题干中给定一个二叉搜索树(BST)的根节点以及一个给定的值,要求我们删除BST中与该值相等的节点,并且删除节点后,该树仍旧满足二叉搜索树的性质。下面举出一个例子

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

    5
   / \
  3   6
 / \   \
2   4   7

给定的有效值Key为 3,因此我们需要在该BST中删除值为3的节点。
下面是删除节点后所得到的一个有效的BST

    5
   / \
  4   6
 /     \
2       7
二、思路分析

二叉搜索树最大的特点就是左孩子节点的值小于或等于根节点,右孩子节点的值大于或等于根节点,再延伸一点就是左子树的每一个节点值都要小于根节点,而右子树的每一个节点值一定大于根节点。因此在删除原有节点后,树的结构需要作出一些调整后才能继续满足这个性质,这个调整也是这题的难点所在。

那么对于一个节点来说,它的可能情况就是只有左孩子,只有右孩子,左孩子右孩子都有,左孩子右孩子都没有。我们对于删除节点后树的调整也分为这四种情况进行。第一种,当被删除节点只有左孩子节点时,我们只需要将其左孩子节点替换掉该节点即可。当被删除节点只有右孩子节点时,同样的,我们只需要将右孩子节点替换掉该节点即可。当被删除节点既没有左孩子节点也没有右孩子节点时,即为叶节点,直接将该节点变为空值,即ROOT=NULL。当即有左孩子节点又有右孩子节点时,这时的变化较为复杂些,我们选择在被删除节点中找到它右子树中最小的那个节点,该节点一定是处于右子树的叶节点中,我们可以先将该叶节点的值赋予给被删除节点,然后将该叶节点赋予空值,即将该叶节点去替换掉被删除节点。

通过以上的思路,我们可以顺利删除节点使得BST仍然成立。只是在第四种情况下,还需要去寻找出右子树中的最小值节点。通过BST的规律我们可知,右子树的最小节点一定是该子树中最左边的那个叶节点,我们只需不断递归找出该子树中最左边那个叶节点即可。

三、C++代码实现

class Solution {
public:
    TreeNode* deleteNode(TreeNode* root, int key) {
        if(root == NULL) return NULL;
        if(root->val > key) {
            root->left = deleteNode(root->left,key);
        } else if(root->val < key) {
            root->right = deleteNode(root->right,key);
        } else {
            if(root->left == NULL) {
                root = root->right;
            } else if(root->right == NULL) {
                root = root->left;
            } else {
                root->right = deleteMin(root->right);
                root->val = min->val;
            }
        }
        return root;
    }
    TreeNode* deleteMin(TreeNode* root){
        if(root == NULL) return root;
        if(root->left == NULL) {
            min = root;
            return root->right;
        }
        root->left = deleteMin(root->left);
        return root;
    }
private:
    TreeNode* min;
};

SolidWorks速成教程P1——简介及基础操作 SolidWorks教程P1——简介及基础操作 阅读详情

相关推荐

第十二节:C#工业控制编程基础--输出正弦波实验

第十二节:基于c#使用开发板输出正弦波实验 文章目录第十二节:基于c#使用开发板输出正弦波实验一、实验目的:了解采集卡DA相关函数的使用。二、实验内容:利用C#生成正弦波,然后用采集卡DA输出。三、实验步骤:1.打开Visual Studio 2013,新建窗体应用程序项目,配置好板卡dll文件。2.在窗体中放入控件,对控件进行布局排版,并修改他们的Name属性和Text属性。3.在Chart控件内选择Spline型图表,如图2。4.进入编程区域,在public partial class Form1 :

weixin_49237052的博客 2296

二叉树:删除二叉搜索树中的节点

然后开始从最底下一层往上传值,下面一层返回的值,其实是上面一个层函数的组成部分,同样,上面一层函数返回的值又是上上面一层函数的组成部分。那按照同样的思路,最底下一层调用递归函数传入的参数会是2这个结点的左子树,也就是。到这里就讲解完毕了,如果还是不明白,结合思路,代码,将这个例子自己理一遍思路。我们在组织代码的时候,脑子里要有向下寻找的过程,更要有一层一层向上回溯的过程。对于1,没找到,说明树不会被修改,将原来的树原封不动返回。对于2,找到了,肯定返回的是最终删除了指定元素的树。

qq_43591406的博客 2722

VS2019集成AddressSanitizer:C++内存错误检测实战指南

在C++开发中,内存管理是核心挑战之一,涉及堆、栈和全局变量的分配与释放。其原理在于程序运行时对内存地址的访问必须严格遵循分配边界和生命周期规则,否则会导致缓冲区溢出、释放后使用等严重错误。这类问题的技术价值在于直接影响程序的稳定性、安全性和性能,是高质量软件必须攻克的基础难题。应用场景广泛,从嵌入式系统到大型服务器软件,都需要可靠的内存错误检测机制。AddressSanitizer(ASan)作为一种编译时插桩技术,通过影子内存和运行时检查,能精准定位堆缓冲区溢出、释放后使用等隐蔽错误。本文以Visual

weixin_34356310的博客 279

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

细心做。 题: 450. 删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点; 如果找到了,删除它。 说明: 要求算法时间复杂度为 O(h),h 为树的高度。 示例: root = [5,3,6,2,4,null,7] key = 3 5 / \ 3 6 / \ \ 2

AndyJ的学习放弃之旅 708

手把手教你用STM32CubeMX配置WS2812的PWM+DMA驱动(附完整代码)

本文详细介绍了如何使用STM32CubeMX配置PWM+DMA驱动WS2812全彩灯带,包括硬件选型、STM32F103C8T6的时钟配置、定时器与PWM设置、DMA传输优化等关键步骤,并提供了完整的代码实现和常见问题解决方案,帮助开发者高效控制WS2812灯带。

weixin_30859423的博客 440

【stm32+K210项目】基于K210与STM32协同工作的智能垃圾分类系统设计与实现(完整工程资料源码)

本系统采用SG90舵机Maix Bit摄像头STM32C8T6主控板以及LX_TRIG_MP3_V6.0语音播报模块,构建了一套高效的智能垃圾分类系统,综合运用了图像识别、语音播报及精准控制技术。SG90舵机负责控制垃圾桶的开盖操作。该舵机通过接收PWM信号来实现转动,内部有一个基准电路产生周期为20ms的PWM信号,通过外部脉冲信号的控制(高电平时间在0.5ms至2.5ms之间),使得舵机的输出轴转动到指定位置。舵机内的位置反馈电位计。

嵌入式技术开发 5099

删除二叉搜索树中的节点 附图超详细

附图详解二叉搜索树节点的删除, 情况比较多, 附图看起来比较清晰, 加油

bestme 1699

iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决

问题现象 Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。 此时检查发现,并没有对App的内购逻辑做任何改动。 那么,这是什么原因导致的呢? Let’s find out!???? 问题分析 1. 排除其它原因 首先,你先得排除不是你IAP内购逻辑变更或其他原因导致的。 在SKProductsRequestDelegat代理实现的productsRequest方法里下断点: func produc

享受开发,颠倒银河 6142

数据结构和算法学习记录——二叉搜索树的插入操作、删除操作

这样处理的好处是:左子树的最大值一定不是有两个孩子节点的情况、而右子树的最小值也一定不是有两个孩子节点的情况。我们已经知道了没有孩子节点的情况和只有一个孩子节点的情况该怎么删除了,当有两个孩子节点的情况时,就考虑能不能把它变成只有一个孩子节点的情况来处理呢?当找到了新节点应该插入的位置时,需要通过找到上一个节点的地址,来将上一个节点的左子树指针或者右子树指针指向新节点。是可以实现的:用另一节点替代被删除的节点,这个节点应是右子树的最小元素或者左子树的最大元素。它形成的二叉搜索树是怎样的呢?

li13437542099的博客 1364

C#项目实战——YModem协议文件传输【实例】

1、先由上位机发送*update*的握手信号,下位机返回响应字符‘C’(字符C,ASII码为0x43),之后通信双方开始以YMODEM协议进行数据通信。2、 YMODEM协议格式说明(1)起始帧数据格式帧类型(1byte)帧序号帧序号反码传输的文件名文件大小数据CRCSOH00FFfilenamefileziseNULCRCSOH=0x01,表示这个数据帧中包含着128个字节的数据(STX表示1024字节,初始帧只有128个);00表示数据帧序号,初始是0,依次向下排。

做有价值的事,积累有价值的笔记! 3655

基于Playwright和反爬虫规避技术的雪球股票讨论数据采集方案

随着量化投资和社交投资的兴起,雪球作为中国领先的投资社交平台,其用户讨论数据成为研究市场情绪的重要来源。本文将详细介绍如何使用最新的Playwright技术和反爬虫规避策略,构建一个高效、稳定的雪球股票讨论爬虫系统。本文详细介绍了基于Playwright的雪球股票讨论爬虫实现方案,涵盖了从基础配置到高级反爬虫策略的各个方面。AI驱动的反爬虫对抗更智能的请求调度算法区块链技术在数据溯源中的应用联邦学习在数据采集中的运用。

2201_76125261的博客 1009

LeetCode 450: 删除二叉搜索树中的节点 Delete Node in a BST

题目: 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可...

爱写Bug 527

红薯游客小眼睛接口分析与Python脚本实现

小眼睛接口与请求流程分析,使用Python实现小眼睛+1

吴秋霖的博客 2615

LeetCode 450. 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...

可控的事情要谨慎,不可控的事情要乐观。 201

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

leetcode 450. Delete Node in a BST 删除二叉搜索树中的节点

本文提出了一种删除二叉搜索树(BST)中指定节点的算法。算法首先通过队列层序遍历找到目标节点,将其父节点对应的指针置空。然后利用BST的性质,将被删除节点的左右子树重新插入到BST中。对于根节点的情况进行了特殊处理。该方法的时间复杂度和空间复杂度均为O(n),其中n为树中节点数量。代码实现使用递归方式重建子树,通过队列进行广度优先搜索定位目标节点。该算法保持了BST的有序性,能够正确处理各种删除情况。

邹九的个人博客 353

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

leetcode 450. 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

蓝羽飞鸟的博客 229

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Leetcode 450.删除二叉搜索树中的节点(Delete Node in a BST)

Leetcode 450.删除二叉搜索树中的节点 1 题目描述(Leetcode题目链接)   给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点; 如果找到了,删除它。 说明: 要求算法时间复杂度为 O(h),h ...

qq_39378221的博客 223

leetcode 450.删除二叉搜索树中的节点 (delete node in a bst)c语言

leetcode 450.删除二叉搜索树中的节点 (delete node in a bst)c语言1.description2.solution 1.description https://leetcode-cn.com/problems/delete-node-in-a-bst/description/ 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的...

hsk6543210的博客 314

[Swift]LeetCode450. 删除二叉搜索树中的节点 | Delete Node in a BST

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://www.cnblogs.com/streng...

weixin_30848775的博客 127

leetcode 450. Delete Node in a BST 删除二叉搜索树中的节点 (中等)

这道题让我们删除二叉搜索树中的一个节点,难点在于删除完节点并补上那个节点的位置后还应该是一棵二叉搜索树。被删除掉的节点位置,不一定是由其左右节点补上,

ln_ydc的专栏 235

Leetcode 450. 删除二叉搜索树中的节点 Delete Node in a BST - Python 递归法

当key不在BST中时,则遍历BST的某一分支都找不到,对吧?即返回到第一层,此时的root和一开始传入的待查找root是一模一样的BST。4.左孩子L和右孩子R都不为None,则找到右子树R的最底层的最左孩子UL。然后让L成为UL的左孩子。1.左右子孩子为None,直接删了完事儿,返回None,与第2.情况一致,可以共用代码;一、key不在二叉搜索树(BST)中,则依此确定递归停止条件,返回None;2.左孩子为None,则返回右孩子为根节点;3.右孩子为None,则返回左孩子为根节点;

rendalian的博客 493

leetcode 450. delete-node-in-a-bst 删除二叉搜索树中的节点 python3

时间:2020-9-23 题目地址:https://leetcode-cn.com/problems/delete-node-in-a-bst/ 题目难度:Medium 题目描述: 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的key对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点; 如果找到了,删除它。 说明: 要求算法时间复杂度为O(h),h 为树的高度。 示...

isabloomingtree的博客 278

[LeetCode] 450. 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 int...

weixin_30635053的博客 160

[leetcode]450. Delete Node in a BST二叉搜索树删除节点

二叉树变量只是一个地址 public static void main(String[] args) { TreeNode t = new TreeNode(3); help(t); System.out.println(t.val); } public static void help(TreeNode t...

weixin_30662109的博客 123

Leetcode-450 Delete Node in a BST(删除二叉搜索树中的节点)

1 class Solution 2 { 3 public: 4 //if doesn't find,return NULL 5 TreeNode *BinarySearchTreeNodeFindMin(TreeNode *TreeRoot) 6 { 7 if(TreeRoot==NUL...

weixin_30340353的博客 123

leetcode [450. 删除二叉搜索树中的节点](https://leetcode-cn.com/problems/delete-node-in-a-bst/)

leetcode 450. 删除二叉搜索树中的节点 给定一个二叉搜索树的根节点 root 和一个值 key,删除二叉搜索树中的 key 对应的节点,并保证二叉搜索树的性质不变。返回二叉搜索树(有可能被更新)的根节点的引用。 一般来说,删除节点可分为两个步骤: 首先找到需要删除的节点; 如果找到了,删除它。 示例 1: 输入:root = [5,3,6,2,4,null,7], key = 3 输出:[5,4,6,2,null,null,7] 解释:给定需要删除的节点值是

yingmu__的博客 229
上一篇: 【Leetcode513 Find Bottom left Tree Value】树的遍历
下一篇: 【70 Climbing Stairs】菲波那切数列解决思路
codekiller_
博客等级 码龄12年 11粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值