代码训练营Day.22 | 235. 二叉搜索树的最近公共祖先、701. 二叉搜索树中的插入操作、450. 删除二叉搜索树中的节点

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

1. LeetCode链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2. 题目描述

3. 解法

利用二叉搜索树的特性进行公共节点的判断:

1. 此节点为公共节点:p、q恰好在此节点的左右棵子树上。即,root的val在p、q的val所构成的闭区间内。

2. 如果p、q的val恰好都大于root的val,则只需要考虑root->right

3. 如果p、q都小于root,则只考虑root->left

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {if (root == NULL) return NULL;if (root->val <= p->val && root->val >= q->val || root->val >= p->val && root->val <= q->val) return root;else if (p->val > root->val && q->val > root->val) return lowestCommonAncestor(root->right, p, q);else return lowestCommonAncestor(root->left, p, q);}
};

更精简一点

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

迭代法

class Solution {
public:TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {queue<TreeNode*> qu;qu.push(root);TreeNode* cur;while (!qu.empty()) {cur = qu.front();qu.pop();if (q->val < cur->val && p->val < cur->val) qu.push(cur->left);else if (q->val > cur->val && p->val > cur->val) qu.push(cur->right);else break;}return cur;}
};

更加精简的:

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. 二叉搜索树中的插入操作

1. LeetCode链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2. 题目描述

 

3. 解法

先在二叉搜索树中查询val,直到找到NULL,然后将val插入该NULL。

迭代:

class Solution {
public:TreeNode* insertIntoBST(TreeNode* root, int val) {TreeNode* a = new TreeNode(val);if (root == NULL) return a;TreeNode* cur = root;while (cur) {if (cur->val > val && cur->left != NULL) cur = cur->left;else if (cur->val > val && cur->left == NULL) {cur->left = a;break;}else if (cur->val < val && cur->right != NULL) cur = cur->right;else {cur->right = a;break;}}return root;}
};

递归。相当于将在遍历至NULL的路上,重新连接原本的树,直到遇到NULL,然后把NULL换成val。

1. 参数和返回值。参数:当前节点和val。返回值:当前节点。

2. 终止条件。遇到NULL且将NULL替换为val。

3. 比较root和val确定从左子树走还是右子树走,root->left = root->left  /  root->right = root->right;

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

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

1. LeetCode链接

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

2. 题目描述

3. 解法

删除节点后,需要考虑是让左子树上位还是右子树上位。这道题的话,无所谓,暂且让左子树上位吧。这个时候问题来了,右子树该如何安排?

其实这道题目可以看成左子树上位后,将右子树插入左子树,因为两边都是二叉搜索树,且左子树必小于右子树,所以只要简单插入即可。

class Solution {
public:TreeNode* insertNode(TreeNode* root, TreeNode* key) {if (root == NULL) return key;if (key == NULL) return root;if (key->val > root->val) root->right = insertNode(root->right, key);if (key->val < root->val) root->left = insertNode(root->left, key);return root;}TreeNode* deleteNode(TreeNode* root, int key) {if (root == NULL) return NULL;if (root->val == key) {TreeNode* left = root->left;TreeNode* right = root->right;delete root;return insertNode(left, right);}if (key > root->val) root->right = deleteNode(root->right, key);if (key < root->val) root->left = deleteNode(root->left, key);return root;}
};

细想的话,其实如果将左子树上位,右子树一定被插在左子树中的最右节点的右节点上;如果让右子树上位,左子树一定被插在最左节点的左节点上。

class Solution {
public:TreeNode* deleteNode(TreeNode* root, int key) {if (root == NULL) return NULL;if (root->val == key) {TreeNode* left = root->left;TreeNode* right = root->right;delete root;if (left == NULL) return right;if (right == NULL) return left;TreeNode* cur = left;while (left != NULL && left->right != NULL) left = left->right;left->right = right;return cur;}if (key > root->val) root->right = deleteNode(root->right, key);if (key < root->val) root->left = deleteNode(root->left, key);return root;}
};

更巧妙的是,删除当前节点后,最合适的候选节点是左子树最右节点或者右子树最左节点。可以通过交换val值,将root换到底部,然后再遇到root后直接删除。

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;}
};

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

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

相关文章

[足式机器人]Part2 Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-自动控制原理Ch1-8Lag Compensator滞后补偿器 从稳态误差入手&#xff08;steady state Error&#xff09; 误差 Error &#xff1a; E ( s ) R ( s ) − X ( s ) R ( s ) − E ( s ) ⋅ K G …

Open3D 最小二乘拟合平面——拉格朗日乘子法

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠原创,原文链接Open3D 最小二乘拟合平面——拉格朗日乘子法。爬虫自重。 一、算法原理 设拟合出的平面方程为: a x + b y +

声明式管理方(yaml)文件

声明式管理方(yaml)文件: 1、适合对资源的修改操作 2、声明式管理依赖于yaml文件&#xff0c;所有的内容都在yaml文件当中。 3、编辑好的yaml文件需要依靠陈述是还是要依靠陈述式的命令发布到k8s集群当中 create只能创建&#xff0c;不能更新。从指定yaml文件中读取配置&#…

unity C# 中通俗易懂LINQ使用案例

文章目录 1. 从数组或列表中查询元素**&#xff1a;2. **排序与分组**&#xff1a;3. **连接多个数据源**&#xff1a;4. **聚合操作**&#xff1a;5. **分页查询**&#xff1a;6. **多条件查询**&#xff1a;7. **转换和投影&#xff08;Select&#xff09;**&#xff1a;8. *…

计算机网络期末复习——计算大题(一)

个人名片&#xff1a; &#x1f981;作者简介&#xff1a;一名喜欢分享和记录学习的在校大学生 &#x1f42f;个人主页&#xff1a;妄北y &#x1f427;个人QQ&#xff1a;2061314755 &#x1f43b;个人邮箱&#xff1a;2061314755qq.com &#x1f989;个人WeChat&#xff1a;V…

SSM养老院综合服务系统----计算机毕业设计

项目介绍 该项目为后台管理项目&#xff0c;分为管理员与护工两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,个人资料密码管理,用户管理,床位类型管理,床位管理,护工管理,老人管理,咨询登记管理,预约登记管理,老人健康信息管理,费用管理等功能。 护…

1.C++语言的编译器及编译流程

1.C编译器 编译器就是将“高级语言”翻译为“机器语言&#xff08;低级语言&#xff09;”的程序。以下是一些主流的C编译器及其简要用法&#xff1a; GNU Compiler Collection (GCC):’ GCC原名GNU C Compiler&#xff0c;后来逐渐支持更多的语言编译&#xff08;C、Fortran、…

Flutter 四:main.dart简单介绍

main.dart简单介绍 运行结果

CNN——LeNet

1.LeNet概述 LeNet是Yann LeCun于1988年提出的用于手写体数字识别的网络结构&#xff0c;它是最早发布的卷积神经网络之一&#xff0c;可以说LeNet是深度CNN网络的基石。 当时&#xff0c;LeNet取得了与支持向量机&#xff08;support vector machines&#xff09;性能相…

看懂 Git Graph

目录 文章目录 目录Git Graph看懂 GraphVSCode Git Graph 插件1. 选择展示的 Branches2. Checkout 到一个 Branch3. 找到指定 Branch 最新的 Commit4. 找到 Branch 分叉口5. 查看 2 个 Commits 之前的区别 Git Graph Git Graph 是服务于 Git 分支管理的一种可视化工具&#xf…

大文件断点下载Range下载zip包显示文件损坏

问题&#xff1a;大文件下载&#xff0c;其它格式的文件及rar格式的压缩包正常下载但是 之后zip包下载后解压失败 原因分析: 1. 查看上传文件的属性值 如图&#xff0c;10.4kb是已经约去小数点的值&#xff0c;准确的大小应该是10663字节10.4130859375KB&#xff0c;所以用10.…

VS Code 远程连接云机器训练配置

VS Code 远程连接云机器 Visual Studio Code&#xff08;以下简称 VS Code&#xff09;是一个由微软开发的代码编辑器。VS Code 支持代码补全、代码片段、代码重构、Git 版本控制等功能。 安装 VSCode步骤简单且网上有很多教程&#xff0c;这里不过多重复了。 VS Code 现已支…

Nacos配置回滚

前言 很多时候&#xff0c;我们会配置错一些属性&#xff0c;或者需要回滚某些属性&#xff0c;这时候使用Nacos的回滚功能就很方便了 配置回滚 1、在控制台中&#xff0c;选择左侧导航栏的 “配置管理”&#xff0c;进入历史版本&#xff0c;选择Group和data id&#xff0c…

以源码为驱动:Java版工程项目管理系统平台助力工程企业迈向数字化管理的巅峰

随着企业规模的不断扩大和业务的快速发展&#xff0c;传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性&#xff0c;企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

vr眼镜和AR眼镜的区别有哪些?哪些产品可以支持VR应用?

vr眼镜怎么连接手机 要将VR眼镜连接到手机上&#xff0c;您可以按照以下步骤进行&#xff1a; 1. 确保您的手机支持VR应用程序&#xff1a;首先&#xff0c;确保您的手机具备运行VR应用程序的硬件和软件条件。一些VR应用程序可能对设备有特定的要求&#xff0c;如处理器性能、操…

【Java并发】深入浅出 synchronized关键词原理-上

一个问题的思考 建设我们有两个线程&#xff0c;一个进行5000次的相加操作&#xff0c;另一个进行5000次的减操作。那么最终结果是多少 package com.jia.syn;import java.util.concurrent.TimeUnit;/*** author qxlx* date 2024/1/2 10:08 PM*/ public class SynTest {privat…

Sharding Sphere 教程 简介

一 文档简介 1.1 分库分表诞生的前景 随着系统用户运行时间还有用户数量越来越多&#xff0c;整个数据库某些表的体积急剧上升&#xff0c;导致CRUD的时候性能严重下降&#xff0c;还容易造成系统假死。 这时候系统都会做一些基本的优化&#xff0c;比如加索引…

高德地图经纬度坐标导出工具

https://tool.xuexiareas.com/map/amap 可以导出单个点&#xff0c;也可以导出多个&#xff0c;多个点可以连成线&#xff0c;可用于前端开发时自己模拟“线“数据

基于Springboot的服务端开发脚手架-自动生成工具

继之前的 专题系列课程&#xff1a; ​​从零开始搭建grpc分布式应用​​完整DEMO&#xff1a;​​基于Springboot的Rpc服务端开发脚手架(base-grpc-framework)​​ 后带来一款项目自动手成工具&#xff08;由于包路径等原因&#xff0c;完整demo想应用在实际开发中需要改很多代…

广州求职招聘(找工作)去哪里找比较好

在广州找工作&#xff0c;可以选择“吉鹿力招聘网”这个平台。它是一个号称直接和boss聊的互联网招聘神器&#xff0c;同时&#xff0c;“吉鹿力招聘网”作岗位比较齐全&#xff0c;企业用户也多&#xff0c;比较全面。在“吉鹿力招聘网”历即可投递岗位。 广州找工作上 吉鹿力…