代码随想录-67-450. 删除二叉搜索树中的节点

news2024/10/7 10:18:43

目录

  • 前言
    • 题目
    • 1.二叉搜索树特性递归找到要删除的节点
    • 2. 本题思路分析:
    • 3. 算法实现
    • 4. 算法坑点

前言

我在刷卡哥的“代码随想录”,自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。
代码随想录此题链接

题目

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.二叉搜索树特性递归找到要删除的节点

按照二叉搜索树特性递归。

2. 本题思路分析:

递归三部曲:

  1. 参数与返回值:
  • 参数:当前节点cur和需要删除节点的值val
  • 返回值:返回TreeNode类型对象
  1. 终止条件:当前节点为null,说明没找到了需要删除的节点,则null即可。
  2. 单层循环逻辑:
  • 如果当前节点的值大于需要删除节点的值,则递归时用左孩子代入,并且递归函数的返回值用当前节点的左孩子接收;
  • 如果当前节点的值小于需要删除节点的值,则递归时用右子树代入,并且递归函数的返回值用当前节点的右子树接收;
  • 返回当前节点的值等于需要删除节点的值,就要删除当前节点,删除节点还有4种情况。
      1. 该节点左右孩子均为null,说明此为叶子节点。直接返回null。(因为递归函数的返回值会有对应左右孩子接收,在java中的删除,相当于父节点对应的左(右)孩子指针从指向本节点到指向null,本节点就找不到了,相当于就被删除了)
      1. 该节点右孩子为空,则说明左孩子不为空(因为第一种情况已经包括了左右孩子均为空的情况),则直接返回左孩子。因为相当于当前节点的左孩子替代了当前节点。(递归函数就是当前节点的父节点的左(右)孩子(也就是当前节点本身)接收,递归函数的参数也是当前节点的父节点的左(右)孩子(也就是当前节点本身),返回当前节点的左孩子,则相当于让当前节点的父节点的左孩子(当前节点的指针)指向了当前节点的左孩子,用当前节点的左孩子替换了当前节点,就相当于把当前节点删除。)
      1. 该节点左孩子为空,则说明右孩子不为空(因为第一种情况已经包括了左右孩子均为空的情况),则直接返回右孩子。分析同第2个。
      1. 改节点左右孩子均不为null。这个稍复杂,就是按照二叉搜索树的性质,当前节点的左子树中的所有节点一定比当前节点右子树中最小的节点还要小。所以应该把左子树放到右子树中最左边的叶子节点的左孩子位置,并且用当前节点的右孩子替换当前节点

3. 算法实现

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.right == null){
                return root.left;
            }else if(root.left == null){
                return root.right;
            }else{
                TreeNode cur = root.right;
                while(cur.left != null){
                    cur = cur.left;
                }
                cur.left = root.left;
                return root.right;
            }
        }else if(root.val > key){
            root.left = deleteNode(root.left, key);
        }else if(root.val < key){
            root.right = deleteNode(root.right, key);
        }
        return root;
    }
}

4. 算法坑点

  1. 本题,当终止条件(cur==null)时,说明在该二叉搜索树上并没有找到了要删除节点,此时直接返回null即可。
  2. 当前节点大于要插入节点的值,表明此时在向左子树中寻找要删除的节点,当cur.left代入参数时,注意这里最精妙的地方是递归函数返回值用cur.left接收
if(cur.val > val){
    cur.left = insertIntoBST(cur.left,val);
} 
  1. 当要删除当前节点,并且情况为当前节点左右孩子均不为null时,按照二叉搜索树的性质,当前节点的左子树中的所有节点一定比当前节点右子树中最小的节点还要小。所以应该把左子树放到右子树中最左边的叶子节点的左孩子位置,并且用当前节点的右孩子替换当前节点。(这个比较难想到)
TreeNode cur = root.right;
while(cur.left != null){//用循环找到最左边的叶子结点
    cur = cur.left;
}
cur.left = root.left;//左子树放到右子树中最左边的叶子节点的左孩子位置
return root.right;//用当前节点的右孩子替换当前节点

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

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

相关文章

【Python】Python中使用Matplotlib绘制折线图、散点图、饼形图、柱形图和箱线图

【Python】使用Matplotlib绘制折线图、散点图、饼形图、柱形图和箱线图 python数据可视化课程&#xff0c;实验二 Matplotlib 中文API&#xff1a;API 概览 | Matplotlib 一、实验任务的数据背景 提供的源数据&#xff08;数据文件employee.csv&#xff09;共拥有4个特征&…

Vue3自定义指令之前端水印功能实现

一、前置知识 — Vue 中的自定义指令 先来说说 vue2和vue3中自定义全局指令的区别 相同点&#xff1a;指令的应用场景&#xff0c;原理是一致的&#xff1b; 不同点&#xff1a;生命周期钩子函数名&#xff0c;指令定义的格式不一样。 vue2中自定义全局指令&#xff1a; 定义…

实时翻译器-实时自动翻译器

自动翻译器——让语言不再是障碍。 在当今全球化的背景下&#xff0c;语言已不再是跨文化交流的障碍。而自动翻译技术作为突破语言壁垒的有效手段&#xff0c;越来越受到关注和需求。我们的自动翻译器就是一个高效、准确的翻译工具&#xff0c;它能够根据用户输入的内容自动识…

mysql知识点看这一篇就够了!

存储引擎 InnoDB InnoDB 是 MySQL 默认的事务型存储引擎&#xff0c;只要在需要它不支持的特性时&#xff0c;才考虑使用其他存储引擎。 InnoDB 采用 MVCC 来支持高并发&#xff0c;并且实现了四个标准隔离级别(未提交读、提交读、可重复读、可串行化)。其默认级别时可重复读…

Springboot项目怎么设计业务操作日志功能?

目录 前言 需求描述与分析 系统日志 操作日志 设计思路 Spring AOP Filter和HandlerInterceptor 过滤器 拦截器 SpringAOP、过滤器、拦截器对比 实现方案 环境配置 依赖配置 表结构设计 代码实现 测试 调试方法 验证结果 总结 前言 很久以前都想写这篇文章…

[ 应急响应基础篇 ] Windows系统隐藏账户详解(Windows留后门账号)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

Spring Web MVC DispatcherServlet详解—官方原版

一、概述 Spring Web MVC是基于Servlet API构建的原始Web框架&#xff0c;从一开始就包含在Spring框架中。正式名称“SpringWebMVC”来自其源模块&#xff08;Spring-webmvc&#xff09;的名称&#xff0c;但它更常见的名称是“SpringMVC”。 与Spring Web MVC并行&#xff0c…

【AIGC】GitHub Copilot 免费注册及在 PyCharm 中的安装使用

欢迎关注【youcans的 AIGC 学习笔记】原创作品 《GitHub Copilot 免费注册及在 VS Code 中的安装使用》 《GitHub Copilot 免费注册及在 PyCharm 中的安装使用》 GitHub Copilot 免费注册及在 PyCharm 中的安装使用1. GitHub Copilot 功能介绍2. 用户注册与申请2.1 个人订阅 Gi…

经典算法50例-无敌五十剑-算法五十重天

这里写目录标题1.汉诺塔2.费式数列3.巴斯卡三角形4.三色棋5.老鼠走迷官&#xff08;一&#xff09;6.老鼠走迷官&#xff08;二&#xff09;7.骑士走棋盘8.八皇后9.八枚银币10.生命游戏11.字串核对12.双色、三色河内塔13.背包问题14.蒙地卡罗法求 PI15.Eratosthenes筛选求质数1…

LeetCode——遍历序列构造二叉树

105从前序与中序遍历序列构造二叉树 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder [3,9,20,15,7], inorder [9,3,15,2…

3.12、生成者消费者模型

3.12、生成者消费者模型1.生产者消费者模型介绍2.一个没有实现线程同步的生产者消费者模型1.生产者消费者模型介绍 生产者消费者模型是一种多线程的设计模式&#xff0c;用于解决生产者和消费者之间的同步和协作问题。 在生产者消费者模型中&#xff0c;生产者和消费者通过共享…

代码随想录算法训练营第五十五天 | 392.判断子序列、115.不同的子序列

打卡第55天。 今日任务 392.判断子序列115.不同的子序列 392.判断子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xf…

哪个品牌的蓝牙耳机便宜耐用?内行公认四大便宜耐用的蓝牙耳机

蓝牙耳机发展至今&#xff0c;品牌众多&#xff0c;且各品牌旗下拥有无数不同价格的耳机&#xff0c;各自的主打优势又不一样。那么&#xff0c;哪个品牌的蓝牙耳机便宜耐用&#xff1f;下面&#xff0c;我来给大家推荐四款便宜耐用的蓝牙耳机&#xff0c;一起来看看吧。 一、…

【数据结构】第九站:树和二叉树

目录 一、树的概念及结构 1.树的概念 2.树的相关概念 3.树的表示 二、二叉树的概念及结构 1.概念 2.特殊的二叉树 3.二叉树的性质 三、二叉树的存储结构 一、树的概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个…

Redis缓冲区溢出及解决方案

缓冲区(buffer)&#xff0c;是内存空间的一部分。也就是说&#xff0c;在内存空间中预留了一定的存储空间&#xff0c;这些存储空间用来缓冲输入或输出的数据&#xff0c;这部分预留的空间就叫做缓冲区。 一、Redis缓冲区溢出影响 在Redis中&#xff0c;主要有三个场景用到了…

数据资产目录建设方法

以信息技术为核心的第四次经济革命使得全球经济进入到数字化转型时期&#xff0c;对于今天的企业来说&#xff0c; 数字化转型已经不是可做可不做的自选题&#xff0c; 而是必须付诸行动的必选题。 从数字化转型的实践经验中我们可以得知&#xff0c;企业的数据资产是企业数字…

Flink CDC 在京东的探索与实践

摘要&#xff1a;本文整理自京东资深技术专家韩飞&#xff0c;在 Flink Forward Asia 2022 数据集成专场的分享。本篇内容主要分为四个部分&#xff1a; 京东自研 CDC 介绍京东场景的 Flink CDC 优化业务案例未来规划点击查看直播回放和演讲 PPT 一、京东自研 CDC 介绍 京东自研…

pdf转换成word怎么转换?这个方法一学就会!

在日常工作和生活中&#xff0c;我们常常会遇到需要将PDF文件转换为Word文档的情况。这个过程有时候会令人感到麻烦和心累&#xff0c;需要特殊操作才能完成。但实际上&#xff0c;通过选择正确的方法&#xff0c;文件格式转换只需要几秒钟的时间。如果你感到不可思议&#xff…

ChatGPT-4 来了,附国内体验地址

chatgpt4是什么&#xff1f; 2022年12月&#xff0c;openAI发布了chatgpt模型&#xff0c;这个属于GPT-3.5系列模型中的一个。上个月&#xff0c;openAI又发布了超级升级版的GPT-4模型。所以&#xff0c;你想问的chatgpt4模型是指代GPT-4模型。 相比前一个版本&#xff0c;它…

智能硬件蓝牙配网方案概要

智能硬件开发系列 Google Protobuf 实践使用开发智能硬件蓝牙配网方案概要JNI开发必学C基础JNI开发必学C使用实践Android Studio 4.0.NDK项目开发详细教学Android NDK与JNI的区别有何不同&#xff1f;Android Studio 4.0.NDK .so库生成打包Android JNI的深度进阶学习Android S…