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

删除二叉搜索树的节点要比插入一个节点更难,区别在于,我们总能找到一个叶子节点,把我们要插入的值缀在后面。

但是删除节点不总是删除叶子节点,还有可能删除一个中间节点,这就需要额外的操作。

我们需要分情况来讨论。

理解题意

        删除二叉搜索树的一个节点:找到指定值进行删除,且如果删除的节点是中间节点,则我们需要调整树结构,使他删除后任然是二叉搜索树。

1.删除的是叶子节点:        直接删除

2.删除的是中间节点:

        左子树为空,右子树不为空: 将当前节点替换为右子树

        左子树不为空,右子树为空:将当前节点替换为左子树

        左子树不为空,且右子树不为空: 则有两种操作:

                可以将右子树上移,为左子树找个合适的位置

                可以将左子树上移,为右子树找个合适的位置

3.找不到删除的节点,返回root本身

两种解题方法:

        递归 回溯

1.递归

该题复杂的地方在于分情况讨论,各种情况处理清楚这道题就会简单。

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&&root.right==null) {//非叶子,左不空,右空,左子树上移return root.left;}else if(root.left==null&&root.right!=null){//非叶子,左空,右不空,右子树上移return root.right;}else{//最复杂的一种情况,左不空,右不空,挑一个上移//这里挑右子树上移,给左子树一个合理的位置TreeNode cur=root.right;while(cur.left!=null) cur=cur.left;cur.left=root.left;return root.right;}}//左子树递归root.left=deleteNode(root.left,key);//右子树递归root.right=deleteNode(root.right,key);return root;}

2.迭代

迭代实现上来看,思路其实并不难,问题在于如何删除一个节点呢,这里引入一个father指针,总是指向当前节点的父节点,通过和父节点值大小的比较,可以明确当前节点是左孩子还是有孩子。

除此之外,当father==null时,说明当前节点是根节点。

唯一比较复杂的地方在于合理的处理删除节点的操作和各种情况分析。

public TreeNode deleteNode2(TreeNode root, int key) {TreeNode father=null;TreeNode preFather=null;TreeNode cur=root;while(cur!=null){if(cur.val==key){//开启删除操作if(cur.left==null&&cur.right==null){//是叶子直接删除if(father!=null&&father.val>key){//删左father.left=null;}else if(father!=null&&father.val<key){//删右father.right=null;}else if(father==null){//是叶子且没有父亲,即为根节点return null;}} else if (cur.left!=null&&cur.right==null) {//非叶子,左不空,右空,左子树上移if(father!=null&&father.val>key){//删左father.left=cur.left;}else if(father!=null&&father.val<key){//删右father.right=cur.left;}else if(father==null){return cur.left;}}else if(cur.left==null&&cur.right!=null){//非叶子,左空,右不空,右子树上移if(father!=null&&father.val>key){//删左father.left=cur.right;}else if(father!=null&&father.val<key){//删右father.right=cur.right;}else if(father==null){return  cur.right;}}else{//最复杂的一种情况,左不空,右不空,挑一个上移//这里挑右子树上移,给左子树一个合理的位置TreeNode node=cur.right;while(node.left!=null) node=node.left;node.left=cur.left;if(father!=null&&father.val>key){//删左father.left=cur.right;}else if(father!=null&&father.val<key){//删右father.right=cur.right;}else if(father==null){return  cur.right;}}//删除结束跳出break;} else if (cur.val>key) {father=cur;cur=cur.left;} else if (cur.val<key) {father=cur;cur=cur.right;}}return root;}

3.分析

时间复杂度:

        递归:O(log2N)

        迭代:O(log2N)

空间复杂度:

        递归:O(n)

        迭代:O(n)

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

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

相关文章

企业微信HOOK开发接口调用,发送语音消息

简要描述 发送语音消息 可以从CDN/CDN文件上传中上传silk文件(silk文件可以自己用mp3转换&#xff0c;或者用语音接收消息的值进行发送)&#xff0c;拿到发送值 操作码 101019 请求说明 参数名必选类型说明username是string用户名password是string密码name否string昵称 请…

linux NAT网卡配置static

由于是内网&#xff0c;资料无法拷贝&#xff0c;借助参考资料&#xff0c;整理发出。 镜像安装 基本操作。 查看VM配置 图1&#xff0c;有几个信息。一个是NAT借用了网卡里的VMnet8适配器。 子网IP是从192.168.142.0 子网掩码255.255.255.255&#xff0c;对应下面配置的N…

Java 的第二十章:多线程

创建线程 继承Thread 类 Thread 类时 java.lang 包中的一个类&#xff0c;从类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建立 Thread 实例。 Thread 对象需要一个任务来执行&#xff0c;任务是指线程在启动时执行的工作&#xff0c;start() 方法启动线程&am…

SpringBoot学习笔记-实现微服务:匹配系统(中)

笔记内容转载自 AcWing 的 SpringBoot 框架课讲义&#xff0c;课程链接&#xff1a;AcWing SpringBoot 框架课。 CONTENTS 1. 同步玩家位置1.1 游戏信息的记录1.2 实现多线程同步移动 2. 同步碰撞检测3. 实现游戏结束界面4. 持久化游戏状态4.1 创建数据库表4.2 保存游戏对局信息…

入门Python+Vue 全栈开发高级BI数据的可视化实战项目几个技术点总结

PythonVue全栈开发是一种强大的技术组合&#xff0c;可以用于构建高级BI数据可视化项目。在这篇文章中&#xff0c;我将总结几个关键技术点&#xff0c;以帮助读者入门并实战这个领域。 数据处理和分析&#xff1a;Python是一种流行的数据处理语言&#xff0c;它提供了丰富的库…

11-30 JavaWeb

修改与删除操作 防止空指针异常 localhost:8080 -> 分页查询 修改流程&#xff1a;(先查后改(两个servlet)) 修改&#xff1a; 传用户id(用户id怎么得到 -> 循环一次得到一个user 对象 user对象里用user.getId()得到用户id) UpdateUserQueryServlet.java &#xff08;…

从浏览器控制台发送get,post请求

---------------------get请求--------------------------- fetch(url, { method: get, }) .then(response > response.json()) .then(data > { // 获取到响应的数据后的处理逻辑 console.log(data); }) .catch(error > { // 请求发生错误的处理逻…

Oracle存储过程返回DataSet(多个DataTable)给C#

一、存储过程 CREATE OR REPLACE PROCEDURE GET_SENDEXCEL_XY ( ZGJ182X OUT SYS_REFCURSOR , ZGJ182Y OUT SYS_REFCURSOR , ZXN182X OUT SYS_REFCURSOR , ZXN182Y OUT SYS_REFCURSOR , ZLH182X OUT SYS_REFCURSOR …

Vue模块与小程序生命周期

文章目录 一、Vue中五个模块1、state2、getters3、mutations4、actions5、modules 二、小程序中的生命周期 一、Vue中五个模块 1、state 是用来存储数据的地方&#xff0c;我们需要传递的数据或者需要保存的数据都会在state中声明。 2、getters 类似于Vue中的计算属性&…

html/css中位置position的绝对位置absolute顺时针盒子案例图片排序

目标图片&#xff1a; Dreamweaver界面&#xff1a; 代码部分&#xff1a; <!doctype html> <html> <head> <meta charset"utf-8"> <title>无标题文档</title> <style type"text/css">.red{background-color:r…

element中el-form-item设置label-width=‘auto‘报错

文章目录 一、问题二、解决三、最后 一、问题 el-form中的设置了全局标题宽度是200px&#xff0c;此时想要对el-form-item取消标题宽度&#xff0c;设置了label-widthauto&#xff0c;结果&#xff0c;报错了~~~ <el-form label-width"200px" label-position&quo…

python的itertools库

itertools常用的方法如下&#xff1a; import itertools 1. 生成的列表累加&#xff0c;在生成新的列表x itertools.accumulate(range(10))print(list(x))结果&#xff1a;[0, 1, 3, 6, 10, 15, 21, 28, 36, 45] 2. 连接多个列表或者迭代器x itertools.chain(range(3), rang…

强大的Kubernetes工具的完整指南

在容器化应用程序编排方面&#xff0c;Kubernetes是市场的领导者。它允许用户在多主机环境中管理容器&#xff0c;提供工作负载分配和网络处理。 此外&#xff0c;它还提供了许多在DevOps过程中至关重要的特性&#xff0c;例如自动扩展、自动修复和负载平衡。这些功能解释了Kub…

Android问题笔记四十八:蓝牙obtainMessage数据传输部分数据丢失乱序问题

Unity3D特效百例案例项目实战源码Android-Unity实战问题汇总游戏脚本-辅助自动化Android控件全解手册再战Android系列Scratch编程案例软考全系列Unity3D学习专栏蓝桥系列ChatGPT和AIGC &#x1f449;关于作者 专注于Android/Unity和各种游戏开发技巧&#xff0c;以及各种资源分…

YOLOv8改进 | 2023 | 通过RFAConv重塑空间注意力(深度学习的前沿突破)

一、本文介绍 本文给大家带来的改进机制是RFAConv&#xff0c;全称为Receptive-Field Attention Convolution&#xff0c;是一种全新的空间注意力机制。与传统的空间注意力方法相比&#xff0c;RFAConv能够更有效地处理图像中的细节和复杂模式(适用于所有的检测对象都有一定的…

springboot+jsp+java房屋销售出租赁网站的ssm设计与实现7xcvq

三、研究方案&#xff08;主要研究内容、目标、研究方法等&#xff09; 主要研究内容 房屋租售网站采用的开发框架为springboot框架&#xff0c;也就是Spring mvc、Spring、MyBatis这三个框架&#xff0c;页面设计用的是jsp技术作为动态页面文件设计&#xff0c;jsp文件里可以对…

【多传感器融合】BEVFusion: 激光雷达和视觉融合框架 NeurIPS 2022

前言 BEVFusion其实有两篇&#xff0c; 【1】BEVFusion: A Simple and Robust LiDAR-Camera Fusion Framework. NeurIPS 2022 | 北大&阿里提出 【2】BEVFusion: Multi-Task Multi-Sensor Fusion with Unified Bird’s-Eye View Representation 2022 | MIT提出 本文先分…

Google Chrome访问出现 NET::ERR_CERT_INVALID

Google Chrome访问出现 NET::ERR_CERT_INVALID然后访问不了当前网站&#xff0c;这个是由于证书失效了&#xff0c;临时解决方式是&#xff1a; 第一种方案&#xff1a; 在Chrome提示“您的连接不是私密连接”页面的空白区域点击一下&#xff0c;然后输入“thisisunsafe”(页…

Android 13.0 SystemUI增加低电量弹窗功能

1.概述 在13.0系统定制开发rom的产品时,对于低电量提醒也是个很好的体验,由于产品要求在低电量的时候增加个弹窗提醒用户电量低及时充电,所以就开发了这个功能 2.SystemUI中实现低电量弹窗功能核心类 /frameworks/base/packages/SystemUI/src/com/android/systemui/System…

过滤器

Filter:用于拦截请求Servlet:处理请求 响应结果 listener:监听器 客户端请求资源&#xff1a;正常直接请求url,同一的资源定位符来进行请求&#xff0c;服务器处理后把结果响应给你&#xff0c;但是由于filter的存在 有放行和拦截两种状态 他的作用就是拦截或者放行请求 加依…