代码随想录算法训练营第十八天(二叉树 六)

news2025/1/19 20:44:03

力扣题部分:

530.二叉搜索树的最小绝对差

题目链接:. - 力扣(LeetCode)

题面:

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

思路:

        写关于二叉搜索树的问题,一定要先掌握二叉搜索树的性质。

        知道中序遍历递增其实这道题就是送分题了,通过中序遍历创造数组遍历一遍就好。

代码实现:

58c53f1604da4d558365a608ba6e58da.png

501.二叉搜索树中的众数

题目链接:. - 力扣(LeetCode)

题面:

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

思路:

        最好想的办法就是创造中序数组,由题意可知该数组是非递减数组,找众数可以先遍历一遍确定最大重复次数,再遍历一遍将重复次数达到最大值的数压进新数组最后return新数组。

代码实现:

d3c1eb29873a4ca5b4ae05edee4e4254.png

236. 二叉树的最近公共祖先

题目链接:. - 力扣(LeetCode)

题面:

给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。

百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”

思路:

        题目给了两个节点让我们找公共祖先,可二叉树从根节点出发往下找容易,怎么从叶子节点往上找呢?

        好像只有这个方法了:通过递归函数并回溯往上找节点。

        由于后序遍历是左右中,先检查左右节点再回溯到中间节点,相比其他两个遍历顺序更适合这道题的逻辑,所以我们采用后序遍历。

首先最容易想到的一个情况:如果找到一个节点,发现左子树出现结点p,右子树出现节点q,或者 左子树出现结点q,右子树出现节点p,那么该节点就是节点p和q的最近公共祖先。

我们将其视为情况一,如图所示:

0db37bdaea6846148710f5e92499c7fe.png

判断逻辑是 如果递归遍历遇到q,就将q返回,遇到p 就将p返回,那么如果 左右子树的返回值都不为空,说明此时的中节点,一定是q 和p 的最近祖先。

还有一种情况容易被忽略,我们视为情况二:

168b03b486214b2c9b7d44afd8952b06.png

其实情况一 和 情况二 代码实现过程都是一样的,因为遇到 q 或者 p 就返回,这样也包含了 q 或者 p 本身就是 公共祖先的情况。可以说,实现情况一的逻辑,顺便包含了情况二。这就是为什么很多人可能没想到这一情况用递归也能AC。

 下面再来我们熟悉的递归三部曲:

确定递归函数返回值以及参数

关于这个方面的判断方法我们在回顾一下:

  • 如果需要搜索整棵二叉树且不用处理递归返回值,递归函数就不要返回值。
  • 如果需要搜索整棵二叉树且需要处理递归返回值,递归函数就需要返回值。
  • 如果要搜索其中一条符合条件的路径,那么递归一定需要返回值,因为遇到符合条件的路径了就要及时返回。

如果需要递归函数返回值,来告诉我们是否找到节点q或者p,那么返回值为bool类型就可以了。

但我们还要返回最近公共节点,可以利用上题目中返回值是TreeNode * ,那么如果遇到p或者q,就把q或者p返回,返回值不为空,就说明找到了q或者p。

确定终止条件

先把终止代码贴上:

if (root == q || root == p || root == NULL) return root;

那么我们来说一说,如果 root == q,或者 root == p,说明找到 q p ,则将其返回,这个返回值,后面在中节点的处理过程中会用到,那么中节点的处理逻辑,下面讲解。

确定单层递归逻辑

值得注意的是 本题函数有返回值,是因为回溯的过程需要递归函数的返回值做判断,但本题我们依然要遍历树的所有节点。

如果递归函数有返回值,如何区分要搜索一条边,还是搜索整个树呢?

搜索一条边的写法:

if (递归函数(root->left)) return ;

if (递归函数(root->right)) return ;

搜索整个树写法:

left = 递归函数(root->left);
right = 递归函数(root->right);
left与right的逻辑处理;

 看出它们的区别了没?

在递归函数有返回值的情况下:如果要搜索一条边,递归函数返回值不为空的时候,立刻返回,如果搜索整个树,直接用一个变量left、right接住返回值,这个left、right后序还有逻辑处理的需要,也就是后序遍历中处理中间节点的逻辑(也是回溯)

那么为什么要遍历整棵树呢?直观上来看,找到最近公共祖先,直接一路返回就可以了。

(就像图中一样直接返回7)

5bd132974899494b93edbac8099dfb3b.png

 然而,找到这两个节点位置的过程需要遍历整棵树,我们不能马上停止找的过程。

也就是说还要遍历根节点右子树(即使此时已经找到了目标节点了),也就是图中的节点4、15、20。

所以此时大家要知道我们要遍历整棵树。知道这一点,对本题就有一定深度的理解了。

然后我们需要理解一下下面的搜索代码逻辑: 

先用left和right接住左子树和右子树的返回值然后进行left 和 right的逻辑处理:

如果left 和 right都不为空,说明此时root就是最近公共节点。这个比较好理解

如果都为空就返回空,这没啥好说的。

如果left为空,right不为空,就返回right,说明目标节点是通过right返回的,反之依然

关于上一行的逻辑,如果还有点懵可以结合下图理解:

b094494b9a9448d696e7f845e087f439.png

图中节点10的左子树返回null,右子树返回目标值7,那么此时节点10的处理逻辑就是把右子树的返回值(最近公共祖先7)返回上去! 

下面是一个搜索例子的全部搜索流程图:

a02b211857984dd29e3d7b828ed6255b.png

 说了这么多,相信你已经可以理解下面代码实现的具体代码了

代码实现:

5d60993750af400dbd5c324e2ecd5d19.png

 

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

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

相关文章

第T11周:优化器对比实验

>- **🍨 本文为[🔗365天深度学习训练营]中的学习记录博客** >- **🍖 原作者:[K同学啊]** 本次主要是探究不同优化器、以及不同参数配置对模型的影响 🚀我的环境: 语言环境:Python3.11.…

CSS 布局

CSS 页面布局技术允许我们拾取网页中的元素,并且控制它们相对正常布局流、周边元素、父容器或者主视口/窗口的位置。布局有一下几种 正常布局流display属性弹性盒子网格浮动定位CSS 表格布局多列布局 每种布局都有它们的用途,各有优缺点,相…

CSS伪类选择器和伪元素

伪类(Pseudo-classes) 伪类用于定义元素的特殊状态。它们被添加到选择器中以指定元素在其生命周期的特定状态下的样式。伪类不创建新的文档内容,也不创建新的文档树中的元素。相反,它们提供了一种方法来根据元素的状态来应用样式…

统信UOS系统连接打印机操作步骤

系统版本 操作步骤 首先点击开始菜单 搜索框输入打印,点击打印管理器 点击图下所示的号 按照图下所示,手动查找->输入打印机的ip地址->点击查找 等到如图下所示,出现打印机的时候,选择打印机,然后选择驱动&…

嵌入式AI快速入门课程-K510篇 (第三篇 环境搭建及开发板操作)

第三篇 环境搭建及开发板操作 文章目录 第三篇 环境搭建及开发板操作1.配置VMware使用桥接网卡1.1 vmware设置1.2 虚拟网络编辑器设置 2.安装软件2.2 安装 Windows 软件2.3 使用MobaXterm远程登录Ubuntu2.4 使用FileZilla在Windows和Ubuntu之间传文件2.5编程示例:Ub…

迎接“云+AI”智算时代!生态案例分论坛议程一览 | 2024 龙蜥大会

2024 龙蜥操作系统大会由中国计算机学会开源发展委员会、中关村科学城委员会、海淀区委网信办、中国开源软件推进联盟指导,龙蜥社区主办,阿里云、中兴通讯、Intel、浪潮信息、Arm、中科方德等 24 家理事单位共同承办,主题为“进化重构赴未来”…

海南云亿商务咨询有限公司助力抖音商家破浪前行

在当下这个短视频与直播电商风起云涌的时代,抖音作为头部平台,正以其庞大的用户基数和强大的算法推荐机制,成为众多品牌与商家竞相追逐的新蓝海。而在这片波澜壮阔的海洋中,海南云亿商务咨询有限公司如同一艘稳健的航船&#xff0…

软件测试 —— JMeter 参数化4种方式!

一、JMeter参数化简介 1.JMeter参数化的概念 当使用JMeter进行测试时,测试数据的准备是一项重要的工作。若要求每次迭代的数据不一样时,则需进行参数化,然后从参数化的文件中来读取测试数据。 参数化:是自动化测试脚本的一种常…

【Prettier】代码格式化工具Prettier的使用和配置介绍

前言 前段时间,因为项目的prettier的配置和eslint格式检查有些冲突,在其prettier官网和百度了一些配置相关的资料,在此做一些总结,以备不时之需。 Prettier官网 Prettier Prettier 是一种前端代码格式化工具,支持ja…

从ESG尽职调查、ESG立法与ESG诉讼谈ESG营销(01)

哈佛大学2024年中回顾全球ESG发展近况 作者:哈佛大学 编辑:数字化营销工兵 2024年上半年,环境、社会和治理(ESG)问题以及对方法的不同意见继续成为全球头条新闻。今年年初,公司及其利益相关者在ESG的支持…

AppenTalk | 不止于赛场,巴黎奥运会上的中国AI科技

当地时间8月11日,第33届夏季奥林匹克运动会在巴黎法兰西体育场落下帷幕。本届奥运会,中国体育代表团收获令人振奋的40金27银24铜总计91枚奖牌,其中金牌数更是创下了境外参加奥运会的最佳成绩。 在中国健儿闪耀奥运赛场时,中国AI科…

Transformer系列-4丨DETR模型和代码解析

1 前言 往期的文章中,笔者从网络结构和代码实现角度较为深入地和大家解析了Transformer模型、Vision Transformer模型(ViT)以及BERT模型,其具体的链接如下: 基础Transformer解析 ViT模型与代码解析 BERT模型与代码解…

嵌入式AI快速入门课程-K510篇 (第七篇 系统BSP开发)

第七篇 系统BSP开发 文章目录 第七篇 系统BSP开发1. 嵌入式Linux系统介绍嵌入式Linux系统组成产品形态嵌入式芯片启动流程Linux系统Linux系统框架嵌入式编译环境 2.嵌入式Linux开发准备手册文档开发工具配套硬件工程源码 3.嵌入式Linux开发组成概述编译工具链什么是工具链什么是…

[Linux#43][线程] 死锁 | 同步 | 基于 BlockingQueue 的生产者消费者模型

目录 1. 死锁 解决死锁问题 2. 同步 2.1 条件变量函数 cond 2.2 条件变量的使用: 3.CP 问题--理论 4. 基于 BlockingQueue 的生产者消费者模型 1. 基本概念 2.BlockQueue.hpp 基本设置: 生产关系控制: 消费关系的控制 ⭕思考点 …

公开整理-全国各省AI算力数据集(2000-2024年)

数据来源:本数据来源于,根据显卡HS编码筛选统计后获得时间跨度:2000-2024年数据范围:省级层面数据指标: 由于未发布2015至2016年的数据,因此该年份数据存在缺失。下表仅展示了部分指标及数据 年份 省份…

Mac apache 配置

命令 sudo apachectl -v //查看apache 版本 sudo apachectl -k start //启动apache sudo apachectl -k stop //停止apache sudo apachectl -k restart //重启apache配置 apache 的配置在 /etc/apache2/httpd.conf 默认情况下httpd.conf 为锁定状态,无法编辑 使用…

SAP B1 三大基本表单标准功能介绍-业务伙伴主数据(三)

背景 在 SAP B1 中,科目表、业务伙伴主数据、物料主数据被称为三大基本表单,其中的标准功能是实施项目的基础。本系列文章将逐一介绍三大基本表单各个字段的含义、须填内容、功能等内容。 附上 SAP B1 10.0 的帮助文档:SAP Business One 10…

单片机外部中断+定时器实现红外遥控NEC协议解码

单片机外部中断定时器实现红外遥控NEC协议解码 概述解码过程参考代码 概述 红外(Infrared,IR)遥控,是一种通过调制红外光实现的无线遥控器,常用于家电设备:电视机、机顶盒等等。NEC协议采用PPM(Pulse Position Modulation&#x…

敏感词替换为星号

编写一个函数,接收一个字符串参数,将其中 的敏感词替换为星号,并返回替换后的结果。 def getReplace(s):wordList["阿里巴巴","苹果","亚马逊","京东","字节","脸书"]for word …

月圆之夜梦儿时 贡秋竹唱响游子心声

自今年年初贡秋竹的首支单曲《逐梦》发布以来,其人气和传唱度便一直屡创新高,口碑上佳表现良好,网友们纷纷隔空喊话贡秋竹再发新作。时至今日,久经打磨的贡秋竹全新力作《低头思故乡》在千呼万唤中终于震撼首发! 贡秋竹…