LeetCode 热题 100 | 二叉树(终)

目录

1  二叉树小结

1.1  模式一

1.2  模式二

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

3  124. 二叉树中的最大路径和


菜鸟做题(返校版),语言是 C++

1  二叉树小结

菜鸟碎碎念

通过对二叉树的练习,我对 “递归” 有了一些肤浅的理解。我发现 “递归” 并不就等价于,先从上往下找到叶节点,再从下往上一直处理到根节点。它其实存在着两种模式。

1.1  模式一
  • 从上到下处理
  • 先处理根节点,后处理左右子树

代码一般都长这样:

function(Treenode * root) {if (!root) return;root->val...function(root->left);function(root->left);...
}

比如 437 题中要算前缀和,那么我们自然想到要从上到下进行累加,因此选择模式一。

1.2  模式二
  • 从下到上处理
  • 先处理左右子树,后处理根节点

代码一般都长这样:

function(Treenode * root) {if (!root) return;function(root->left);function(root->right);root->val......
}

比如 236 题要找公共祖先,那么我们自然想到要从下往上找,因此选择模式二。

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

解题思路:

  • 判断当前节点的左右子树是否存在 p 或 q
  • 一旦当前节点的左右子树各自包含了 p 或 q
  • 那么当前节点为最近公共祖先

详细代码:

① 判断左右子树中是否存在 p 或 q,若有则 lson、rson 会为 true:

bool lson = helper(root->left, p, q);
bool rson = helper(root->right, p, q);

相应的返回值如下:

return lson || rson || (root == p || root == q);

意思是,对于某个子树的根节点,如果它的左右子树包含 p 或 q,或者它本身就是 p 或 q,那么等价于这个子树包含 p 或 q 。比如:对于浅绿色子树,根节点 “5” 的右子树(深绿色)包含 q,那么也等价于浅绿色子树包含 q 。

② 判断当前节点是否为最近公共祖先:

if ((lson && rson) || ((root == p || root  == q) && (lson || rson))) {ans = root;
} 

这一行代码非常 tricky,((root == p || root  == q) && (lson || rson)) 是啥意思?它的意思是,root 等于 p 或者 q,左子树或右子树找到 p 或者 q,只要这两个条件同时成立,那么当前节点 root 就是最近公共祖先。

为什么这个判断条件没有要求指明 root 和 lson、rson 分别找到的是 p 还是 q 呢?因为只要一方确定了,另一方自然就确定了。比如:如果 root 等于 p,那么 lson 或者 rson 之前找到的一定是 q 而不是 p,否则就矛盾了。

class Solution {
public:TreeNode * ans;bool helper(TreeNode* root, TreeNode* p, TreeNode* q) {if (!root) return false;bool lson = helper(root->left, p, q);bool rson = helper(root->right, p, q);if ((lson && rson) || ((root == p || root  == q) && (lson || rson))) {ans = root;} return lson || rson || (root == p || root == q);}TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {helper(root, p, q);return ans;}
};

3  124. 二叉树中的最大路径和

解题思路:

  • 从下向上遍历二叉树
  • 路径和 = 根节点 + 根节点的左子树 + 根节点的右子树
  • 根节点向父节点推荐自己

这里说的根节点泛指每个子树的根节点;“根节点的左子树” 具体是指从左子树中找出的最大路径和,后文所提到的 “左子树” 也是这个意思。

思路说明图:

针对根节点 “20”,“20” 的左子树(“15”)和右子树(“7”)会向 “20” 自荐,只要它们不拖后腿(路径和为负),那么 “20” + 它的左子树 + 它的右子树 的路径和就是最大的。接着,“20” 会选择左子树和右子树中的较大者,一起向父节点 “-10” 自荐。以此类推。

为什么 “20” 只能携带一棵子树?因为我们构造的是一条笔直的路径,如果左右子树都带上,那这条路就分叉了。

class Solution {
public:int maxSum = INT_MIN;int helper(TreeNode* root) {if (!root) return 0;// 获取左右子树中的最大路径和int leftSum = max(0, helper(root->left));int rightSum = max(0, helper(root->right));// 计算当前子树的最大路径和int pathSum = root->val + leftSum + rightSum;maxSum = max(maxSum, pathSum);// 向父节点自荐return root->val + max(leftSum, rightSum);}int maxPathSum(TreeNode* root) {helper(root);return maxSum;}
};

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

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

相关文章

【激光SLAM】基于滤波的激光SLAM方法(Grid-based)

Filter-based SLAM 贝叶斯滤波数学概念贝叶斯滤波特性贝叶斯滤波的推导 粒子滤波(Particle filter)特性流程状态传播权重评估重采样算法流程存在的问题 FastSLAM的原理及优化FastSLAM介绍算法流程FastSLAM优化存在的问题及优化进一步优化proposal分布最终…

RabbitMQ学习整理————基于RabbitMQ实现RPC

基于RabbitMQ实现RPC 前言什么是RPCRabbitMQ如何实现RPCRPC简单示例通过Spring AMQP实现RPC 前言 这边参考了RabbitMQ的官网,想整理一篇关于RabbitMQ实现RPC调用的博客,打算把两种实现RPC调用的都整理一下,一个是使用官方提供的一个Java cli…

思维模型整合

思维模型整合 4P--- 4C思考模型能力圈模型 4P— 4C思考模型 在竞争激烈的今天,每个赛道都有众多可以为客户提供相同价值的对手,而赛道中的佼佼者之所以能打败大部分人,可能并不是他们能比别人更能讨好大众,而是因为在这个赛道它有…

Jmeter学习系列之六:阶梯加压线程组Stepping Thread Group详解

性能测试中,有时需要模拟一种实际生产中经常出现的情况,即:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间。 在jmeter中,有这样一个插件,可以帮我们实现这个功能,这个插件就是:Stepping Thread Group 1、下载配置方法 1.1.下载配置 插件下载地址:…

Selenium定位不到元素怎么办?一定要这么做

在使用Selenium进行自动化测试时,碰到无法定位元素该怎么办?这里总结了9种情况下的元素定位方法: 1、frame/iframe表单嵌套 WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌的页面元素无法直接定位。 解决…

Jenkins持续集成Python项目

一、前言   之前学习了很多自动化测试框架,但是写的脚本都是本地执行,多数用来造数据。最近公司掀起一股自动化测试的风,所以就想研究下如何集成jenkins,本次采用pytest,用的是阿里云服务器centos7。 二、服务器环境…

石头剪刀布游戏(C语言)

题目描述 石头剪刀布游戏有 3 种出拳形状:石头、剪刀、布。分别用字母 A , B , C 表示。 游戏规则: 出拳形状之间的胜负规则如下: A > B;B > C;C > A;">"左边一个字母,表示相对优…

bat 查找文件所在

脚本 在批处理文件(.bat)中查找文件所在的目录,你可以使用dir命令结合循环和条件语句来实现。以下是一个简单的示例,演示如何在批处理文件中查找指定文件并输出其所在目录: echo off setlocal enabledelayedexpansio…

Vue 封装的 axios 类的使用(小bug 改进)

http类 import { baseUrl } from "./config"; //引入config.js中的配置 import axios from "axios"; //引入axios import qs from "querystringify"; //form-Data请求时的工具类class Http{axios null;lastRequestIntercept null…

开源LLMs导览:工作原理、顶级LLM列表对比

目录 一、开源 LLM 是什么意思?二、开源LLM如何工作?2.1 预训练2.2 代币化2.3 开源LLM的微调2.4 输入编码2.5 训练与优化2.6 推理 三、开源LLM对组织的好处3.1 增强的数据安全和隐私3.2 节约成本3.3 减少供应商依赖性3.4 代码透明度 四、哪种LLM模式最好…

数据可视化在商业领域有哪些重要性?

数据可视化在商业领域的重要性体现在多个方面,它通过将复杂的数据集转化为直观、易于理解的图形和图表,帮助企业和组织做出更明智的决策。以下是数据可视化对商业的一些关键重要性: 提高决策效率:通过直观的图表和图形&#xff0c…

漫漫数学之旅031

文章目录 经典格言数学习题古今评注名人小传 - 经典格言 如果没有数学知识,这个世界的事物是无法搞清楚的。——罗杰培根(Roger Bacon) 好的,各位看官,让我们来听听罗杰培根这位中世纪的“科学老顽童”是怎么说的&…

罗克韦尔AB的PLC实现ModbusTCP和ModbusRTU协议标签方式通讯

本文是通过IGT-DSER智能网关读写AB罗克韦尔Compact、Control系列PLC的标签数据缓存并转为Modbus从站协议,与上位机通讯的案例。 打开智能网关的参数软件(下载地址),通过功能->数据转发与平台对接,再选择数据转发与缓存’,进入以…

基于java+springboot+vue实现的城市垃圾分类管理系统(文末源码+Lw)23-191

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本城市垃圾分类管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数…

基于Java+Selenium的WebUI自动化测试框架(一)---页面元素定位器

🔥 交流讨论:欢迎加入我们一起学习! 🔥 资源分享:耗时200小时精选的「软件测试」资料包 🔥 教程推荐:火遍全网的《软件测试》教程 📢欢迎点赞 👍 收藏 ⭐留言 &#x1…

使用python查看官网是否发布新的内容

目录 前言 第一章、python介绍和使用pip install下载包 1.python介绍 2.使用vscode编写python 3.pip install的使用 第二章、查看官网是否发布新的内容 第三章、代码实现 目录结构 代码实现 check_new_news.py files.py news.py main.py file.txt 运行演示 前言 也…

【Azure 架构师学习笔记】- Azure Databricks (7) --Unity Catalog(UC) 基本概念和组件

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (6) - 配置Unity Catalog 前言 在以前的Databricks中,主要由Workspace和集群、SQL Warehouse组成, 这两年Databricks公…

我们在SqlSugar开发框架中,用到的一些设计模式

我们在《SqlSugar开发框架》中,有时候都会根据一些需要引入一些设计模式,主要的目的是为了解决问题提供便利和代码重用等目的。而不是为用而用,我们的目的是解决问题,并在一定的场景下以水到渠成的方式处理。不过引入任何的设计模…

【YOLOX-nano】YOLOX-nano的推理实践

目录 1 pt文件和pth文件的区别 2 安装依赖库 3 模型下载 4 实践 YOLOX-nano.pth模型转换为YOLOX-nano.onnx模型</

SpringBoot对于SpringMVC的支持

创建项目 版本说明这里使用的 SpringBoot 2.0.0.Release SpringBoot对于SpringMVC的支持 在之前的开发中很多场景下使用的是基于xml配置文件或者是Java配置类的方式来进行SpringMVC的配置。一般来讲&#xff0c;初始的步骤如下所示 1、初始化SpringMVC的DispatcherServlet2、…