代码随想录算法训练营第二十二天| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

系列文章目录


目录

  • 系列文章目录
  • 235. 二叉搜索树的最近公共祖先
    • ①递归法
      • 自己写的
      • 简洁版
    • ②迭代法
      • 不能这样写!
      • 正确写法
  • 701.二叉搜索树中的插入操作
    • ①递归法
    • ②迭代法
  • 450.删除二叉搜索树中的节点
    • 递归法


235. 二叉搜索树的最近公共祖先

①递归法

自己写的

class Solution {TreeNode result;public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//终止条件if (root == null || root == p || root == q) return root;if (root.val > p.val && root.val > q.val) {result = lowestCommonAncestor(root.left,p,q);} else if (root.val < p.val && root.val < q.val) {result = lowestCommonAncestor(root.right,p,q);} else {return root;}return result;}
}

简洁版

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left,p,q);if(root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right,p,q);return root;}
}

②迭代法

不能这样写!

图片来自热心网友(大佬)

图片来自热心网友(大佬)

56的最近公共祖先是8而不是4

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {while (root.val > p.val && root.val > q.val) root = root.left;while (root.val < p.val && root.val < q.val) root = root.right;return root;}
}

正确写法

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {while (true) {if (root.val > p.val && root.val > q.val) {root = root.left;} else if (root.val < p.val && root.val < q.val) {root = root.right;} else {break;}}return root;}
}

701.二叉搜索树中的插入操作

①递归法

递归三部曲:

  1. 确定递归函数参数以及返回值:参数就是根节点指针,以及要插入元素,这里递归函数要不要有返回值呢?可以有,也可以没有,但递归函数如果没有返回值的话,实现是比较麻烦的,下面也会给出其具体实现代码。有返回值的话,可以利用返回值完成新加入的节点与其父节点的赋值操作
  2. 确定终止条件:终止条件就是找到遍历的节点为null的时候,就是要插入节点的位置了,并把插入的节点返回。
  3. 确定单层递归的逻辑
    • 如果root.val > val,说明应该将val插入左子树
      • 如果左子树不存在,将val作为root.left
      • 如果左子树存在,让左子树插入val
    • 如果root.val < val,说明应该将val插在右子树
      • 如果右子树不存在,将val作为root.right
      • 如果右子树存在,让右子树插入val
    • 返回插入val后的根节点,即左右子树插入节点后的根节点。
class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {//终止条件if (root == null) return new TreeNode(val);if (root.val > val) {root.left=insertIntoBST(root.left, val);} else if (root.val < val) {root.right=insertIntoBST(root.right, val);}return root;}
}

②迭代法

迭代法遍历的过程中,需要记录一下当前遍历的节点的父节点,这样才能做插入节点的操作。用pre指针来记录上一个节点。

class Solution {public TreeNode insertIntoBST(TreeNode root, int val) {if (root == null) return new TreeNode(val); // root为空,直接插入后返回TreeNode newRoot = root;//记录根节点TreeNode pre = null;// 这个很重要,需要记录上一个节点,否则无法赋值新节点while (root != null) {pre = root;if (root.val > val) {root = root.left;} else if (root.val < val) {root = root.right;}}//插入节点的操作if (pre.val > val) {pre.left = new TreeNode(val);} else {pre.right = new TreeNode(val);}return newRoot;}
}

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

二叉搜素树的性质:

左子树的所有val< 当前节点的val< 右子树的最小val= 右子树的最左边节点的val值。

递归法

递归三部曲:

  1. 确定递归函数参数以及返回值:通过递归返回值删除节点。
  2. 确定终止条件:删除当前节点的逻辑放在终止条件中,二叉搜索树中删除节点有以下五种情况:
    • 第一种情况:没找到删除的节点,遍历到空节点直接返回了;
    • 找到删除的节点
      • 第二种情况:左右孩子都为空(叶子节点),直接删除节点, 返回NULL为根节点;
      • 第三种情况:删除节点的左孩子为空,右孩子不为空,删除节点,右孩子补位,返回右孩子为根节点的右子树;
      • 第四种情况:删除节点的右孩子为空,左孩子不为空,删除节点,左孩子补位,返回左孩子为根节点的左子树;
      • 第五种情况:左右孩子节点都不为空,则将删除节点的左子树头结点(左孩子)放到删除节点的右子树的最左面节点的左孩子上,返回删除节点的右节点,作为删除后树的根节点。

:终止条件可以简化为:

        if (root == null) return root;//找不到要删除的节点,返回nullif (root.val == key) {if (root.left == null) {return root.left;} else if (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;}}

其中当要删除的节点的左右子树都不为空,一直循环找到右子树最左边的节点时,注意判断条件必须为while (cur.left != null) 而不能是while (cur != null) ,否则会在cur.left = root.left;这里报空指针异常。

class Solution {public TreeNode deleteNode(TreeNode root, int key) {//终止条件if (root == null) return root;//找不到要删除的节点,返回nullif (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.val > key,证明要删除的节点应该会出现在左子树上,获取左子树删除key节点后的根节点作为新的左节点if (root.val > key) root.left = deleteNode(root.left, key);// 如果root.val < key,证明要删除的节点应该会出现在右子树上,获取右子树删除key节点后的根节点作为新的右节点if (root.val < key) root.right = deleteNode(root.right, key);// 返回删除key节点后的根节点return root;}
}

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

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

相关文章

书生·浦语大模型InternLM-Chat-1.8B 智能对话 Demo 第二期

文章目录 InternLM-Chat-1.8B 智能对话 Demo环境准备下载模型运行 InternLM-Chat-1.8B web 运行八戒 demo下载模型执行Demo InternLM-Chat-1.8B 智能对话 Demo 环境准备 在InternStudio平台中选择 10% A100(1/4) 的配置&#xff08;平台资源有限&#xff09;&#xff0c;如下图…

【c语言】自定义类型:联合体(公用体)【详解】

联合体 联合体类型的声明 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫&#xff1a;共用体。 给联合体其中⼀个成…

2024阿里云域名优惠口令免费领取,COM、CN和xin域名口令

2024年阿里云域名优惠口令&#xff0c;com域名续费优惠口令“com批量注册更享优惠”&#xff0c;cn域名续费优惠口令“cn注册多个价格更优”&#xff0c;cn域名注册优惠口令“互联网上的中国标识”&#xff0c;阿里云优惠口令是域名专属的优惠码&#xff0c;可用于域名注册、续…

【QT入门】 自定义标题栏界面qss美化+按钮功能实现

往期回顾&#xff1a; 【QT入门】 鼠标按下和移动事件实现无边框窗口拖动-CSDN博客【QT入门】 设计实现无边框窗口拉伸的公用类-CSDN博客【QT入门】对无边框窗口自定义标题栏并实现拖动和拉伸效果-CSDN博客 【QT入门】 自定义标题栏界面qss美化按钮功能实现 一、最终效果 二、…

【JAVASE】学习类与对象的创建和实例化

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 目标&#xff1a; 1. 掌握类的定义方式以及对象的实例化 2. …

MVCC的实现原理

简介 MVCC&#xff08;Multi-Version Concurrency Control&#xff09;即多版本并发控制。 MVCC的实现原理 我们在了解MVCC之前&#xff0c;首先先了解一下几个比较常见的锁。 **读锁&#xff1a;**也叫共享锁、S锁&#xff0c;若事务T对数据对象A加上S锁&#xff0c;则事务…

一维卷积神经网络的特征可视化

随着以深度学习为代表的人工智能技术的不断发展&#xff0c;许多具有重要意义的深度学习模型和算法被开发出来&#xff0c;应用于计算机视觉、自然语言处理、语音处理、生物医疗、金融应用等众多行业领域。深度学习先进的数据挖掘、训练和分析能力来源于深度神经网络的海量模型…

使用OpenCV4.9的随机生成器和文本

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;OpenCV 4.9基本绘图 下一篇&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 目标 在本教程中&#xff0c;您将学习如何&#xff1a; 使用随机数生…

软件架构风格_2.调用/返回体系结构风格

调用/返回风格是指在系统中采用了调用与返回机制。利用调用-返回实际上是一种分而治之的策略&#xff0c;其主要思想是将一个复杂的大系统分解为若干子系统&#xff0c;以便降低复杂度&#xff0c;并且增加可修改性。程序从其执行起点开始执行该构件的代码&#xff0c;程序执行…

分发饼干(力扣455)

文章目录 题目贪心算法思想概述关键要素解题步骤优缺点优点缺点 应用领域 题解一、思路二、解题方法三、Code 总结 题目 Problem: 455. 分发饼干 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。对每个孩子 i&am…

2024 ccfcsp认证打卡 2023 05 01 重复局面

2023 05 01 重复局面 题目题解1题解2区别&#xff1a;数据存储方式&#xff1a;时间复杂度&#xff1a;空间复杂度&#xff1a; 总结&#xff1a; 题目 题解1 import java.util.*;public class Main {public static void main(String[] args) {Scanner input new Scanner(Sys…

Stream 流和 Lambda 组装复杂父子树形结构

在最近的开发中&#xff0c;遇到了两个类似的需求&#xff1a;都是基于 Stream 的父子树形结构操作&#xff0c;返回 List 集合对象给前端。于是在经过需求分析和探索实践后有了新的认识&#xff0c;现在拿出来和大家作分享交流。 一般来说完成这样的需求大多数人会想到递归&a…

面试题 之 vue

1.vue里怎样实现双向数据绑定&#xff1f; Viewmodel 中的Domlisteners 工具会帮我们检测页面上Dom元素的变化&#xff0c;如果有变化&#xff0c;则更改Model中的数据&#xff0c;更新model中的数据时&#xff0c;数据事件绑定工具会帮我们更新页面中的Dom元素 2.Vue的响应式原…

3d代理模型怎么转换成标准模型---模大狮模型网

在当今的虚拟世界中&#xff0c;3D建模技术被广泛运用于游戏开发、电影制作、工业设计等领域。在3D建模过程中&#xff0c;有时会遇到需要将代理模型转换成标准模型的情况。模大狮将从理论和实践两方面&#xff0c;介绍如何将3D代理模型转换成标准模型&#xff0c;以帮助读者更…

【MySQL】事务是什么?事务的特性又是什么?

文章目录 ✍事务是什么&#xff1f;✍事务的特性&#xff08;四个&#xff09;✍事务并发时出现的问题✍事务的隔离性 ✍事务是什么&#xff1f; 事务是由一个或多个SQL语句构成的&#xff0c;在事务中&#xff0c;这些的SQL不可分割&#xff0c;是一个整体&#xff0c;整个事…

C++万物起源:类与对象(三)拷贝构造、赋值重载

目录 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 1.2拷贝构造的实现 1.3默认构造函数 1.4拷贝构造函数典型调用场景 二、赋值运算符重载 2.1赋值运算符重载的格式 一、拷贝构造函数 1.1拷贝构造函数的概念与特征 在c语言语法中&#xff0c;我们可以将一个变量赋值给…

vue实现导出列表为xlsx文件

1.安装依赖 npm install --save xlsx file-saver 2.引入依赖 import FileSaver from file-saver; import * as XLSX from xlsx; 3.代码实现 <el-button type"primary" click"exportData">导出数据</el-button><el-tableid"table_ex…

怎样在Linux搭建NTP服务器

搭建 NTP&#xff08;Network Time Protocol&#xff09;服务器可以帮助你在局域网内提供时间同步服务&#xff0c;让网络中的设备都使用统一的时间。以下是在 Linux 系统上搭建 NTP 服务器的基本步骤&#xff1a; 安装 NTP 服务器软件&#xff1a; 在终端中执行以下命令安装 N…

JavaSE阶段十组易混淆概念总结

目录 &#x1f4cc; & 与 && &#x1f4cc; this 与 super &#x1f4cc; 方法重载与重写 &#x1f4cc; 抽象类与接口 &#x1f4cc; "" 与 equals &#x1f4cc; String 与 StringBuffer &#x1f4cc; HashSet 与 HashMap &#x1f4cc; Coll…

【CANN训练营笔记】Atlas 200I DK A2体验手写数字识别模型训练推理

环境介绍 开发板&#xff1a;Huawei Atals 200I DK A2 内存&#xff1a;4G NPU&#xff1a;Ascend 310B4 CANN&#xff1a;7.0 准备环境 下载编译好的torch_npu wget https://obs-9be7.obs.cn-east-2.myhuaweicloud.com/wanzutao/torch_npu-2.1.0rc1-cp39-cp39-linux_aarch…