Day25 235二叉搜索树的公共祖先 701二叉搜索树插入 450二叉搜索树删除

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

如果利用普通二叉树的方法,就是利用后序遍历回溯从低向上搜索,遇到左子树有p,右子树有q,那么当前结点就是最近公共祖先。本题是二叉搜索树,所以说是有序的,一定能够简化上面的方法。如果中间节点是p和q的公共祖先,那么他一定是在p和q区间的,即中节点 > p && 中节点 < q 或者 中节点 > q && 中节点 < p。所以在每次遍历时,都加上这个判断条件会比较好。递归代码如下:

class Solution {
private:TreeNode* traversal(TreeNode* cur, TreeNode* p, TreeNode* q) {if (cur == NULL) return cur;// 中if (cur->val > p->val && cur->val > q->val) {   // 左TreeNode* left = traversal(cur->left, p, q);if (left != NULL) {return left;}}if (cur->val < p->val && cur->val < q->val) {   // 右TreeNode* right = traversal(cur->right, p, q);if (right != NULL) {return right;}}return cur;}
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {return traversal(root, p, q);}
};

         当然,本题代码还可以精简:

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);} else if (root->val < p->val && root->val < q->val) {return lowestCommonAncestor(root->right, p, q);} else return root;}
};

 因为是二叉搜索树,所以迭代法也很简单,一般二叉搜索树迭代法都比普通二叉树简单,因为这棵树是有序的:

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {while(root) {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 return root;}return NULL;}
};

 701 二叉搜索树的插入操作

进行二叉搜索树的插入操作并不需要调整二叉树的结构,因为特殊性,每次插入的结点都能插入到叶子上面,所以递归的方法就比较简单了

class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {if (root == NULL) {TreeNode* node = new TreeNode(val);return node;}if (root->val > val) root->left = insertIntoBST(root->left, val);if (root->val < val) root->right = insertIntoBST(root->right, val);return root;}
};

 本题也可以利用迭代法:

class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {//如果为空节点此时直接进行插入(说明是一颗空树)if (root == NULL) {TreeNode* node = new TreeNode(val);return node;}TreeNode* cur = root; //记录当前的结点TreeNode* parent = root; // 这个很重要,需要记录上一个节点,否则无法赋值新节点while (cur != NULL) {parent = cur; //上一个结点接连等于当前结点,之后当前结点变动if (cur->val > val) cur = cur->left;else cur = cur->right;}//此时遍历到空节点了,也就是要插入val的位置TreeNode* node = new TreeNode(val);if (val < parent->val) parent->left = node;// 此时是用parent节点的进行赋值else parent->right = node;return root;}
};

 450 删除二叉搜索树中的结点

注意此时有些情况就需要改变二叉树的结构了,因为删除的并不一定是叶子节点。

class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if(root == nullptr) return root; //如果是空节点直接返回,说明没有找到要删除的节点if(root->val == key){//要删除的节点为叶子结点if(root->left==nullptr&&root->right==nullptr){delete root;return nullptr;}//要删除的节点左空右不空if(root->left==nullptr&&root->right!=nullptr){TreeNode* node = root->right;delete root;return node;}//要删除的结点左不空右空if(root->left!=nullptr&&root->right==nullptr){TreeNode* node = root->left;delete root;return node;}//要删除的节点左右都不空,让右面的结点顶替他(当然左面的也可以,这里只写一种)if(root->left!=nullptr&&root->right!=nullptr){TreeNode* cur = root->right;while(cur->left) cur = cur->left;cur->left=root->left;TreeNode* tmp = root;root = root->right;delete tmp;return root;}}if(root->val > key) root->left = deleteNode(root->left, key);if(root->val < key) root->right = deleteNode(root->right, key);return root;}
};

 

这里我在介绍一种通用的删除,普通二叉树的删除方式(没有使用搜索树的特性,遍历整棵树),用交换值的操作来删除目标节点。

代码中目标节点(要删除的节点)被操作了两次:

  • 第一次是和目标节点的右子树最左面节点交换。
  • 第二次直接被NULL覆盖了。
    class Solution {
    public:TreeNode* deleteNode(TreeNode* root, int key) {if (root == nullptr) return root;if (root->val == key) {if (root->right == nullptr) { // 这里第二次操作目标值:最终删除的作用return root->left;}TreeNode *cur = root->right;while (cur->left) {cur = cur->left;}swap(root->val, cur->val); // 这里第一次操作目标值:交换目标值其右子树最左面节点。}root->left = deleteNode(root->left, key);root->right = deleteNode(root->right, key);return root;}
    };

 迭代法:

class Solution {
private:// 将目标节点(删除节点)的左子树放到 目标节点的右子树的最左面节点的左孩子位置上// 并返回目标节点右孩子为新的根节点// 是动画里模拟的过程TreeNode* deleteOneNode(TreeNode* target) {if (target == nullptr) return target;if (target->right == nullptr) return target->left;TreeNode* cur = target->right;while (cur->left) {cur = cur->left;}cur->left = target->left;return target->right;}
public:TreeNode* deleteNode(TreeNode* root, int key) {if (root == nullptr) return root;TreeNode* cur = root;TreeNode* pre = nullptr; // 记录cur的父节点,用来删除curwhile (cur) {if (cur->val == key) break;pre = cur;if (cur->val > key) cur = cur->left;else cur = cur->right;}if (pre == nullptr) { // 如果搜索树只有头结点return deleteOneNode(cur);}// pre 要知道是删左孩子还是右孩子if (pre->left && pre->left->val == key) {pre->left = deleteOneNode(cur);}if (pre->right && pre->right->val == key) {pre->right = deleteOneNode(cur);}return root;}
};

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

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

相关文章

深圳易图讯科技VR三维电子沙盘系统

易图讯VR三维电子沙盘系统是一种结合虚拟现实技术的地理信息系统。它通过高精度三维模型&#xff0c;真实再现了地理环境、建筑布局和地形地貌。用户可通过VR设备沉浸式体验这一虚拟世界&#xff0c;进行各种交互操作&#xff0c;如缩放、旋转、移动等。系统还支持实时数据更新…

k8s的yaml文件中的kind类型都有哪些?(详述版Part2/2)

目录 综述 分块详述 13、ConfigMap 14、Secret 15、Ingress 16、StorageClass 17、Namespace 18、ServiceMonitor 19、HorizontalPodAutoscaler 20、NetworkPolicy 21、CustomResourceDefinition 22、Role 23、ClusterRole 24、ClusterRoleBinding 25、RoleBindi…

stm32与python端进行串口收发

1-1 串口发送端&#xff08;stm32&#xff09; 1字符串发送 /************状态&#xff1a;电机速度、位置和角位移传感器的速度、位置*****************/ // 字符串收发&#xff1a;已调试成功motor_position Read_Encoder_Angle(Encoder);sensor_position Get_Adc_Ave…

门店管理系统驱动智慧零售升级

在当今数字化经济的大潮中&#xff0c;实体门店正在经历一场由内而外的深度变革。门店管理系统以其高效、便捷和全面的功能特性&#xff0c;为实体店提供了高效的运营解决方案。 门店管理系统拜托了传统零售业对本地化软件的依赖&#xff0c;它将复杂的信息技术转化为易于获取…

2024十大开放式耳机品牌有哪些?公认好用的开放式耳机测评推荐

随着生活水平的提升&#xff0c;人们对音频设备的需求已经不再只是简单的声音输出&#xff0c;而是追求更高质量的听觉体验&#xff0c;而近几年出现的开放式耳机正是为了满足这一需求而诞生的&#xff0c;凭借着不入耳的设计带来了极致的佩戴体验&#xff0c;这种耳机也成为了…

如何克隆驱动器,不同的操作系统有不同的推荐软件

你需要将Windows或macOS安装迁移到新驱动器吗?你可以使用服务备份文件,也可以创建数据的完整一对一副本。通过克隆你的驱动器,你可以创建一个精确的副本。 一些业务级别的备份服务,如IDrive和Acronis,具有内置的磁盘克隆功能,是对正常文件备份的补充。但对于一次性克隆(…

SpringBoot+策略模式实现多种文件存储模式

一、策略模式 背景 针对某种业务可能存在多种实现方式&#xff1b;传统方式是通过传统if…else…或者switch代码判断&#xff1b; 弊端&#xff1a; 代码可读性差扩展性差难以维护 策略模式简介 策略模式是一种行为型模式&#xff0c;它将对象和行为分开&#xff0c;将行…

Python中的图像处理和计算机视觉应用

Python是一种广泛使用的编程语言&#xff0c;在图像处理和计算机视觉领域有广泛的应用。以下是一些Python中图像处理和计算机视觉的应用示例&#xff1a; 图像处理&#xff1a;Python有许多强大的图像处理库&#xff0c;如PIL&#xff08;Python Imaging Library&#xff09;和…

【python 100个常用关键字,解释他们如何使用。】

python 。实际上&#xff0c;Python 语言中只有少数几十个关键字。以下是 Python 3.9 中的关键字列表&#xff0c;并对其中一些关键字的简要解释&#xff1a; False - 表示布尔类型的假值。None - 表示一个空值或者不存在的值。True - 表示布尔类型的真值。and - 逻辑与操作符…

实现导航栏吸顶操作

一、使用VueUse插件 // 安装 npm i vueuse/core二、点击搜索useScroll 2.1搜索结果如图 三、使用 // 这是示例代码 import { useScroll } from vueuse/core const el ref<HTMLElement | null>(null) const { x, y, isScrolling, arrivedState, directions } useSc…

oracle数据库raw数据类型

Oracle 数据库中的 RAW 数据类型是一种用于存储原始二进制数据的数据类型。它可以存储任意字节的数据&#xff0c;并且不对数据进行任何解析或转换。RAW 数据类型非常适合存储图像、音频、视频和其他二进制文件。 以下是一些关于 RAW 数据类型的要点&#xff1a; 1. 存储空间…

结构型设计模式——适配器模式

适配器模式 这个更加好理解&#xff0c;就是做适配功能的类&#xff0c;例如&#xff0c;现在手机没有了圆形耳机接口&#xff0c;只有Type-C接口&#xff0c;因此你如果还想要使用圆形耳机的话需要买个圆形接口转Type-C的转换器&#xff08;适配器&#xff09;&#xff0c;这…

【Java 设计模式】设计原则

文章目录 ✨单一职责原则&#xff08;SRP&#xff09;✨开放/封闭原则&#xff08;OCP&#xff09;✨里氏替换原则&#xff08;LSP&#xff09;✨依赖倒置原则&#xff08;DIP&#xff09;✨接口隔离原则&#xff08;ISP&#xff09;✨合成/聚合复用原则&#xff08;CARP&#…

深入理解云原生技术:构建现代化可靠的应用

引言 云原生技术作为软件开发和部署的新范式&#xff0c;以其高度可伸缩性、灵活性和可靠性&#xff0c;吸引了广泛的关注。本文将深入探讨云原生技术的核心概念、优势以及其在现代软件开发中的应用。 1. 什么是云原生技术&#xff1f; 云原生技术是一种以云计算为基础&#…

美国NDC药品码注册详细介绍(OTC药品FDA注册)

美国药品验证号&#xff08;NDC&#xff09;注册介绍 希望我发布的文章能帮助到刷到的有缘人 国家药品验证号&#xff08;NDC&#xff09;是中国中药及OTC非处方药通过FDA认证的快捷申请形式。主要针对美国国家药典已有的药&#xff0c;无需做新药论证&#xff0c;只需提供必…

【Py/Java/C++三种语言详解】LeetCode每日一题240109【动态规划】LeetCode2707题、字符串中的额外字符

文章目录 题目描述解题思路简单举例哈希集合进行查找动态规划三部曲 代码pythonjavacpp时空复杂度 华为OD算法/大厂面试高频题算法练习冲刺训练 题目描述 给你一个下标从 0 开始的字符串 s 和一个单词字典 dictionary 。你需要将 s 分割成若干个 互不重叠 的子字符串&#xff…

百度Java面试

百度社招 一面 1、上来照例还是问了问项目&#xff1a; 答&#xff1a;我介绍了自己的项目背景&#xff0c;项目的整个流程&#xff0c;由于是一个多人合作的项目&#xff0c;还介绍了自己负责项目的哪个模块&#xff0c;以及这个模块如何实现的&#xff0c;我感觉我个人说话语…

How to view the high-tech zone atmospheric project

How to view the high-tech zone atmospheric project 当前现状登录界面没有验证码部分页面加载时间过长联动型下拉列表框点击反应迟钝页面缺乏导航没有采用https协议没有完成域名实名认证左侧菜单区不能收缩大屏区域功能图层不能完全隐藏部分页面表单控件没有文案提示其功能部…

揭秘阿里自研搜索引擎 Havenask 在线检索服务

作者&#xff1a;谷深 Havenask 是阿里巴巴智能引擎事业部自研的开源高性能搜索引擎&#xff0c;深度支持了包括淘宝、天猫、菜鸟、高德、饿了么在内几乎整个阿里的搜索业务。本文针对性介绍了 Havenask 的在线服务&#xff0c;它具备高可用、高时效、低成本的优势&#xff0c;…