代码随想录 10.13 || 二叉树 LeetCode 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

二叉树的定义:

        回顾一下二叉树的定义,加固记忆。

struct TreeNode {int val;TreeNode *left;TreeNode *right;TreeNode() : val(0), left(nullptr), right(nullptre) {}TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};

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

        与普通二叉树中的最近公共祖先不同,求二叉搜索树的最近公共祖先更为容易一些,因为二叉搜索树自带顺序性,我们可以根据节点的值寻找目标节点的位置。

        如果,当前节点的值同时大于 节点 p 和 q 的值,说明 p 和 q 在当前节点的左子树中,反之则位于右子树中。

        如果,当前节点的值大于其中一个节点,小于另一个节点,当前节点即为给定节点 p 和 q 的最近公共祖先。

class Solution { // 递归法
private:TreeNode* traversal(TreeNode *node, TreeNode *p, TreeNode *q) {if (node->val > p->val && node->val > q->val) return traversal(node->left, p, q);if (node->val < p->val && node->val < q->val) return traversal(node->right, p, q);return node;}public:TreeNode* lowestCommonAncestor(TreeNode *root, TreeNode *p, TreeNode *q) {if (root == nullptr) return root;return traversal(root, p, q);}
};

        在递归法中,我们递归遍历二叉树,在不满同时大于或小于条件时,直接返回当前节点,即最近公共祖先。

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

        迭代法代码则更为简洁,使用 while 一直向下遍历,直至找到目标节点为止,如果未找到,则说明目标不存在给定二叉树中。

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

        向一颗二叉搜索树中插入一个节点,众所周知,在二叉搜索树中,左子树的值一定小于根节点的值,右子树的值一定大于根节点的值,我们需要找到合适的位置插入给定节点,而不是应该随意插入,插入完成后的树,应该保持二叉搜索树的性质。

class Solution { // 递归法
private:TreeNode* traversal(TreeNode *node, int val) {if (node->val > val && node->left != nullptr) return traversal(node->left, val);if (node->val < val && node->right != nullptr) return traversal(node->right, val);return node;}public:TreeNode* insertIntoBST(TreeNode *root, int val) {if (root == nullptr) {TreeNode *node = new TreeNode(val);return node;}TreeNode *fnode = traversal(root, val);TreeNode *cnode = new TreeNode(val);if (fnode->val > val) fnode->left = cnode;else fnode->right = cnode;return root;}
};

        在递归法中,我们仍然利用二叉搜索树的性质,寻找插入位置。如果,待插入节点的值小于当前节点,且当前节点的左子树不为空,则向左子树遍历;如果,待插入节点的值大于当前节点,且当前节点的右子树不为空,则向右子树遍历。不满足上述条件,则说明当前节点的左子树或右子树为空,此时我们就找到了插入位置的父节点,将其返回。在主函数中,我们定义一个 fnode 接收返回节点,然后以 val 初始化一个节点,并根据 val 的值,将其添加到 fnode 的左子树或右子树上。在最后,返回更新过后的 root 即可。

class Solution { // 迭代法
public:TreeNode* insertIntoBST(TreeNode *root, int val) {if (root == nullptr) {TreeNode *node = new TreeNode(val);return node;}TreeNode *cur = root;while(1) {if (cur->val > val && cur->left != nullptr) cur = cur->left;else if (cur->val < val && cur->right != nullptr) cur = cur->right;else break;}TreeNode *node = new TreeNode(val);if (cur->val > val) cur->left = node;else cur->right = node;return root;}
};

        迭代法代码更为简洁,同样利用循环找位置,然后添加新节点至目标位置。

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

        与向二叉搜索树中添加节点不同,从树中删除节点会破坏树的结构,涉及到树的重塑。分析,如果删除二叉搜索树中的某一个节点,存在以下四种情况:

        1)待删除节点为叶子节点,不需要更改树的结构,直接将待删除节点置空;

        2)待删除节点的左叶子节点不为空,右叶子节点为空,将待删除节点的左子树上移;

        3)待删除节点的左叶子节点为空,右叶子节点不为空,将待删除节点的右子树上移;

        4)如果待删除节点的左右子树都不为空,需要更改二叉搜索树的结构,以确保删除节点后,仍然保持二叉搜索树的性质。可以将待删除节点的左子树挂到右子树的最左节点下,也可将待删除节点的右子树挂到左子树的最右节点下,在此我们选择第一种方法。

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;} else if (root->left == nullptr && root->right != nullptr) {TreeNode *node = root->right;delete root;return node;} else if (root->left != nullptr && root->right == nullptr) {TreeNode *node = root->left;delete root;return node;} else {TreeNode *node = root->right;while (node->left != nullptr) node = node->left;node->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;}
};

        在最后返回根节点 root,如果删除发生在左子树,则用左子树接收变更后的左子树,右子树亦然。

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

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

相关文章

crontab配置定时根据名称杀进程

服务器上某个进程杀掉后会重启&#xff0c;怀疑是被当成肉鸡&#xff0c;因此是用linux自带的crontab定时执行脚本杀掉进程 上传脚本文件到服务器 #! /bin/bash # 要杀掉进程的名称 APPLICATION"ntools"if pkill -f "${APPLICATION}"; thenecho "${…

深度学习之基于Pytorch的昆虫分类识别系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介系统架构技术亮点 二、功能三、系统四. 总结 一项目简介 # 深度学习基于 Pytorch 的昆虫分类识别系统介绍 深度学习在图像分类领域取得了显著的成就&#…

ArcGIS Pro 优化的热点分析【Optimized Hot Spot Analysis】

ArcGIS Pro 优化的热点分析【Optimized Hot Spot Analysis】Optimized Hot Spot Analysis 优化的热点分析https://mp.weixin.qq.com/s/lfoIls8exW5G6PPJ9gtDew em&#xff0c;先给大家推荐一个空间统计分析的学习资源网站 https://spatialstats-analysis-1.hub.arcgis.com/ .…

策略选股辅助工具(八)

8-策略选股辅助工具 文章目录 8-策略选股辅助工具一. 查询某个股票日常分析数据的信息二. 查询可以做T的股票的策略信息三. 查询股票K线类型四. 查询策略因子筛选股票信息五. 查询日K数据 处理成 Pdf图信息六. 根据股票的编码和日期获取那段时间的所有的数据信息 一. 查询某个股…

[oeasy]python001_先跑起来_python_三大系统选择_windows_mac_linux

先跑起来 &#x1f94a; Python 什么是 Python&#xff1f; Python [ˈpaɪθɑ:n]是 一门 适合初学者 的编程语言 类库 众多 几行代码 就能 出 很好效果 应用场景丰富 在 各个应用领域 都有 行内人制作的 python 工具类库 非常专业、 好用 特别是 人工智能领域 pytho…

渲染器——双端Diff算法

简单 Diff 算法利用虚拟节点的 key 属性&#xff0c;尽可能地复用 DOM 元素&#xff0c;并通过移动 DOM 的方式来完成更新&#xff0c;从而减少不断地创建和销毁DOM 元素带来的性能开销。但是&#xff0c;简单 Diff 算法仍然存在很多缺陷&#xff0c;这些缺陷可以通过双端 Diff…

【阿里云】图像识别 摄像模块 语音模块

USB 摄像头模块测试及配置 一、首先将 USB 摄像头插入到 Orange Pi 开发板的 USB 接口中二、然后通过 lsmod 命令可以看到内核自动加载了下面的模块三、通过 v4l2-ctl 命令可以看到 USB 摄像头的设备节点信息为 /dev/video0四、使用 fswebcam 测试 USB 摄像头五、使用 motion …

chrome内置路径合集

设置黑夜模式&#xff1a; 输入网址&#xff1a;chrome://flags/ 搜索dark 改为enable 实验项目路径 chrome://flags/ 可用来启用或者关闭某些 Chrome 的实验功能 chrome://settings 将快速打开 Chrome 浏览器的设置页面&#xff0c;页面的内容分类划分为基础和高级设置选项 …

以太网_底层

【实物图】 【网线接口】 MAC(媒体访问控制器)&#xff1a;控制数据的收发和管理&#xff0c;和用户层打交到&#xff1b;通过MII/RMII、SMI接口和PHY进行通信。 PHY(以太网物理层收发器)&#xff1a;中间体&#xff0c;负责收发信号的转换 常见PHY芯片有&#xff1a;LAN8720…

ES学习看这一篇文章就够了

ES学习看这一篇文章就够了 ES学习看这一篇文章就够了-CSDN博客

PIL如何批量给图片添加文字水印?

PIL如何批量给图片添加文字水印&#xff1f; 1 简单引入2 关于PIL3 本文涉及的PIL的几个类4 实现原理5 实现过程5.1 原始图片5.2 导入相关模块5.3 初始化数据5.4 水印字体设置5.5 打开原始图片并新建存储对象5.6 计算图片和水印的大小5.7 选择性设置水印文字5.8 绘制文字并设置…

基于yolov8的车牌检测训练全流程

YOLOv8 是Ultralytics的YOLO的最新版本。作为一种前沿、最先进(SOTA)的模型&#xff0c;YOLOv8在之前版本的成功基础上引入了新功能和改进&#xff0c;以提高性能、灵活性和效率。YOLOv8支持全范围的视觉AI任务&#xff0c;包括检测, 分割, 姿态估计, 跟踪, 和分类。这种多功能…

Java项目实战《苍穹外卖》 三、登录功能

测测你是什么人格吧&#xff0c;地址&#xff1a; MBTI 16种人格测试官网 系列文章目录 苍穹外卖是黑马程序员2023年的Java实战项目&#xff0c;作为业余练手用&#xff0c;需要源码或者课程的可以找我&#xff0c;无偿分享 Java项目实战《苍穹外卖》 一、项目概述Java项目实战…

Redis从入门到精通(三)-高阶篇

文章目录 0. 前言[【高阶篇】3.1 Redis协议(RESP )详解](https://blog.csdn.net/wangshuai6707/article/details/132742584)[【高阶篇】3.3 Redis之底层数据结构简单动态字符串(SDS)详解](https://blog.csdn.net/wangshuai6707/article/details/131101404)[【高阶篇】3.4 Redis…

java算法学习索引之栈和队列(未完)

一 设计一个有getMin功能的栈 实现一个特殊的栈&#xff0c;在实现栈的基本功能的基础上&#xff0c;再实现返回栈中最小元素的操作。 【要求】1.pop、push、getMin操作的时间复杂度都是O&#xff08;1&#xff09;。 2.设计的栈类型可以使用现成的栈结构。 public class …

Java实现堆算法

堆是一种特殊的数据结构&#xff0c;它是一棵完全二叉树&#xff0c;且满足堆的性质&#xff1a;对于每个节点&#xff0c;它的值都不小于&#xff08;或不大于&#xff09;它的孩子节点的值。根节点的值就是堆中的最大值&#xff08;或最小值&#xff09;。 Java中提供了一个…

LeetCode:2216. 美化数组的最少删除数(C++)

目录 2216. 美化数组的最少删除数 题目描述&#xff1a; 实现代码与解析&#xff1a; 贪心&#xff1a; 原理思路&#xff1a; 2216. 美化数组的最少删除数 题目描述&#xff1a; 给你一个下标从 0 开始的整数数组 nums &#xff0c;如果满足下述条件&#xff0c;则认为数…

自然语言处理:Transformer与GPT

Transformer和GPT&#xff08;Generative Pre-trained Transformer&#xff09;是深度学习和自然语言处理&#xff08;NLP&#xff09;领域的两个重要概念&#xff0c;它们之间存在密切的关系但也有明显的不同。 1 基本概念 1.1 Transformer基本概念 Transformer是一种深度学…

HarmonyOS基础组件之Button三种类型的使用

简介 HarmonyOS在明年将正式不再兼容Android原生功能&#xff0c;这意味着对于客户端的小伙伴不得不开始学习HarmonyOS开发语言。本篇文章主要介绍鸿蒙中的Button使用。 HarmonyOS中的Button相较于Android原生来说&#xff0c;功能比较丰富&#xff0c;扩展性高&#xff0c;减…

mysql binlog

binlog日志介绍 什么是 binlog binlog是server层共有的&#xff0c;是记录的数据更新历史&#xff0c;主要用来做主从同步和数据的实时备份。 binlog 怎么开启 mysql的配置文件添加相关配置并重启mysql # 1. linux打开mysql配置文件 vi /etc/my.cnf# 2. 添加binlog配置 [mysql…