Leetcode第450题删除二叉搜索树中的结点|C语言

news2024/12/24 11:29:20

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

一般来说,删除节点可分为两个步骤:
1.首先找到需要删除的节点;
2.如果找到了,删除它。

大致思路:先用pre和T遍历分别找到要删除的结点的父结点和要删除的结点,遍历之后可分为以下几种情况:
1.要删除的结点是根节点
2.要删除的几点不是根节点
2.1要删除的结点是pre的右子树
2.1.1要删除的结点的右子树非空
2.1.2要删除的结点的右子树为空
2.2要删除的结点是pre的左子树
2.2.1要删除的结点的右子树非空
2.2.2要删除的结点的右子树为空

为什么会有这么多种情况呢?或者说为什么最后总要判断右子树为空呢?
蓝色结点为要删除的结点
我们可以看一下题目给的例子。要删除3结点,那么pre就是5结点,此时3结点是5结点的左子树,即上面的2.2。
现在我们假设右子树为空,即如果现在没有这个4,那我们直接拿2这一子树作为pre(5)的左子树接上就可以了。
而现在有4这一子树,即右子树非空。由于右子树>根节点>左子树,所以肯定得把4这一子树作为5的左子树接上。至于2子树接在哪,我们得先遍历找到4子树最左下的结点(这一结点是4子树中值最小的结点,但由于右子树>根节点>左子树这一性质,作为曾经3的左右子树内的结点,4子树中值最小的结点的值也会比2子树中值最大的结点的值大),将2子树作为上面提到的最左下的结点的左子树接入。
至于2.1,则思路类似,只是左右需要作些更改,不再赘述。

struct TreeNode* deleteNode(struct TreeNode* root, int key){
    struct TreeNode* T=root;
    struct TreeNode* pre=NULL;
    if(root==NULL)
        return NULL;
    while(T!=NULL&&T->val!=key){
        if(T->val>key){
            pre=T;
            T=T->left;
        }
        else if(T->val<key){
            pre=T;
            T=T->right;
        }
    }
    //以上遍历找到要删除的结点T和该结点的前一个结点pre
    
    if(T!=NULL&&T->val==key){
        if(pre==NULL){//前一个结点为空,即要删除的是根节点
            if(T->right==NULL){//右子树为空
                root=T->left;
                free(T);
            }            
            else{//右子树非空
                root=T->right;
                struct TreeNode* l=root;
                while(l->left!=NULL)
                    l=l->left;
                l->left=T->left;
                free(T);   
            }
        }
     
        else{//要删除的不是根节点
            if(T->val>pre->val){//前一个结点的值小于要删除结点的值,即要删除的是pre的右子树
                if(T->right!=NULL){//T的右子树非空
                    struct TreeNode* l=T->right;
                    while(l->left!=NULL)//寻找T右子树的最左下结点
                        l=l->left;
                     l->left=T->left;//T的左子树接在右子树最左下结点上
                    pre->right=T->right;//将T的右子树接在pre的右子树位置上
                    free(T);
                }
                else{//右子树为空
                    pre->right=T->left;
                    free(T);
                }            
            }
            else{//要删除的是pre的左子树
                if(T->right!=NULL){//T的右子树非空
                    struct TreeNode* l=T->right;
                    while(l->left!=NULL)//遍历找到最左下结点
                        l=l->left;
                    l->left=T->left;//T的左子树接在T右子树的最左下结点
                    pre->left=T->right;//T的右子树接在pre的左子树位置上
                    free(T);
                 }
                else{//右子树为空
                    pre->left=T->left;
                    free(T);
                }      
            }
        }        
    }
    
    return root;
}

执行情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/366917.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一个跟蘑菇结缘的企业老板

记得那是一个很久以前的一家公司了董事长办公室里中的大型盆栽里面长了一个蘑菇董事长认为是祥瑞每天都会浇水后来一个新来的保洁阿姨以为杂草啥的给他掰掉扔垃圾桶了董事长第二天来浇水的时候发现没了就问谁动了他的蘑菇问道之后就跑到楼道大垃圾桶那里把蘑菇找回来种在花盆里…

“点工”的觉悟,5年时间从7K到24K的转变,我的测试道路历程~

2015年7月我从一个90%以上的人都不知道的二本院校毕业&#xff08;新媒体专业&#xff09;&#xff0c;凭借自学的软件测试&#xff08;点点点&#xff09;在北京找到了一份月薪7000的工作&#xff0c;在当时其实还算不错&#xff0c;毕竟我的学校起点比较差&#xff0c;跟大部…

python学习笔记——csv文件

目录 一、csv文件和Excel文件区别 二、手动转换&#xff08;文本与列表&#xff09; ①普通的写(列表嵌套转成文本的表格形式) ②普通的读&#xff08;文本的表格形式转成列表嵌套&#xff09; 二、csv库-读 1、CSV库-读-reader() 2、CSV库-读-DictReader() 三、csv库-写 …

基于YOLO的酸枣病虫害检测识别实践

在我前面的博文中对于农作物病虫害的检测识别已经做过了&#xff0c;不过那个主要是针对水稻的&#xff0c;文章如下&#xff1a;《基于yolov5的轻量级水稻虫害目标检测项目实践》感兴趣的话可以自行移步阅读。这里主要是针对酸枣常见的几种病虫害检测检测识别&#xff0c;首先…

苹果电脑如何录屏?3个方法,轻松学会

苹果电脑是很多创作者、视频制作人和经常工作用户的选择&#xff0c;但是如何在苹果电脑上录制高质量的屏幕视频呢&#xff1f;苹果电脑如何录屏&#xff1f;本文将介绍3种不同的方法&#xff0c;帮助小伙伴轻松学会如何在苹果电脑上录制屏幕视频。 方法一&#xff1a;使用Mac自…

假设检验的基本思想

假设检验 首先了解参数估计&#xff0c;比如有服从正态分布的数据集X∼N(μ,σ2)X\sim N(\mu,\sigma^{2})X∼N(μ,σ2)&#xff0c;我们希望根据样本x1,...xnx_{1},...x_{n}x1​,...xn​估计出参数μ,σ\mu,\sigmaμ,σ&#xff0c;这些参数可以是一个具体值&#xff0c;也可以…

【C++】Windows动态库【.DLL文件】制作方法总结

如题&#xff0c;我们本篇介绍如何制作DLL&#xff0c;将代码类中的方法以接口的形式暴露出来给exe程序使用。会涉及类厂创建方法实例、声明DLL接口、.def文件的使用等。 目录 一、DLL介绍 二、C制作DLL文件 2.1 DLL端 2.2 调用端 三、DLL导出类方法 四、COM技术制作DLL…

扎心话题 | 设计院背后的潜规则你知道吗?

大家好&#xff0c;我是建模助手。 大家都知道&#xff0c;在过去的2022年经济是真难&#xff01;以小编所在的广东为例&#xff0c;全年GDP增长仅1.9%。 这个数据足以呈现一个社会现象——不仅消费力咔咔下降&#xff0c;各行各业更有不同程度地嗝屁。这其中也包括一些设计院…

只要一直向前定能到达远方,社科院与杜兰大学金融管理硕士项目为你注入动力

在人生这条道路上&#xff0c;我们很远的路要走&#xff0c;不管前方是否平坦&#xff0c;我们只要坚持前向&#xff0c;终将抵达远方。一路上我们付出很多&#xff0c;也收获很多。想要变得更强大&#xff0c;就要不断优化自身&#xff0c;积攒更多的能量&#xff0c;社科院与…

Flask入门(10):Flask使用SQLAlchemy

目录11.SQLAlchemy11.1 简介11.2 安装11.3 基本使用11.4 连接11.5 数据类型11.6 执行原生sql11.7 插入数据11. 8 删改操作11.9 查询11.SQLAlchemy 11.1 简介 SQLAlchemy的是Python的SQL工具包和对象关系映射&#xff0c;给应用程序开发者提供SQL的强大功能和灵活性。它提供了…

浅析无人值守+智慧巡检变电站安全管控系统设计方案

一、项目背景 安全是电力生产的基石&#xff0c;确保电网安全和人身安全&#xff0c;是电网企业安全工作的出发点和落脚点。 随着智能信息化技术应用越来越广泛&#xff0c;智能信息化现场安全管理是近年来基于智能安全巡检技术下发展起来的现场作业安全管理新技术。 变电站运…

【机器学习】朴素贝叶斯算法

朴素贝叶斯&#xff08;Naive Bayes&#xff09;是经典的机器学习算法之一&#xff0c;也是为数不多的基于概率论的分类算法。由于朴素贝叶斯计算联合概率&#xff0c;所以朴素贝叶斯模型属于生成式模型。经典应用案例包括&#xff1a;文本分类、垃圾邮件过滤等。 1.贝叶斯公式…

rust 安装

rust 安装一、需要一个c的环境二、配置环境变量三、开始安装一、需要一个c的环境 安装Visual Studio 二、配置环境变量 Rust需要安装两个东西&#xff0c;一个是rustup&#xff0c;一个是cargo。所以你需要设置两个环境变量来分别指定他们的安装目录。 通过RUSTUP_HOME指定…

滤波算法:经典卡尔曼滤波

卡尔曼滤波实质上就是基于观测值以及估计值二者的数据对真实值进行估计的过程。预测步骤如图1所示&#xff1a; ​图1 卡尔曼滤波原理流程图 假设我们能够得到被测物体的位置和速度的测量值 ​&#xff0c;在已知上一时刻的最优估计值 ​以及它的协方差矩阵 的条件下&#xff…

ChatGPT热潮背后,金融行业大模型应用路在何方?——金融行业大模型应用探索

ChatGPT近两个月以来不断引爆热点&#xff0c;对人工智能应用发展的热潮前所未有地高涨&#xff0c;ChatGPT所代表的大模型在语义理解、多轮交互、内容生成中所展现的突出能力令人惊喜。而人工智能技术在金融行业的落地应用仍然面临挑战&#xff0c;虽然已经让大量宝贵的人力从…

易基因|ChIP-seq等组学研究鉴定出结直肠癌的致癌超级增强子:Nature子刊

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。超级增强子&#xff08;Super enhancer&#xff09;是一类包含多个普通增强子的大簇&#xff0c;主要富集高密度的转录因子、辅助因子及增强子相关表观修饰位点。与普通增强子相比&#xf…

canal实时同步mysql数据到elasticsearch(部署,配置,测试)

这里写目录标题简介工作原理MySQL主备复制原理canal 工作原理canal 使用流程环境搭建环境使用版本mysql配置修改配置创建从库权限账号创建测试数据库创建测试数据表elasticsearch配置创建索引建立映射canal的下载部署下载canal配置服务端 canal-deployer配置客户端canal-adapte…

Keysight E5061B网络分析仪

Keysight E5061B&#xff08;安捷伦&#xff09;网络分析仪可在 5 Hz 至 3 GHz 的宽频率范围内提供多功能的高性能网络分析。E5061B 提供了 ENA 系列共有的出色射频性能&#xff0c;还提供了成熟的 LF&#xff08;低频&#xff09;网络测量功能&#xff1b;包括带有内置 1 Mohm…

【Vue学习】Vue基本使用

1. 模板语法 插值&#xff1a;使用双大括号进行数据的插值&#xff0c;包括文本、JS表达式。动态属性&#xff1a;可以使用模板字符串。如果使用标签使用了v-html指令&#xff0c;那么标签中的子元素会被引入的html代码覆盖掉&#xff0c;同时也会存在xss风险。 2. compute…

Python + Airtest + poco + pytest + pytest-html 实现Android App自动化测试框架

Python Airtest poco pytest pytest-html 实现Android App自动化测试框架 一、背景 为了尝试除Appium外的测试框架&#xff0c;本文将介绍基于网易的airtest框架为基础&#xff0c;配合poco及pytest实现对Android App的自动化测试。 二、框架介绍 框架集成使用airtest p…