LeetCode 热题 100 | 二叉树(终)

news2024/9/22 9:41:39

目录

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.coloradmin.cn/o/1464405.html

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

相关文章

适用于 Windows 10、11 的 5 款最佳免费文件恢复软件

最好的免费文件恢复软件是什么? 如今,人们通常将数据保存在硬盘或云备份上。除此之外,您还可以将重要数据存储在 USB 或其他电子设备上。 但是,如果您遇到存储设备故障、存储设备逻辑故障或意外删除,您可能会丢失文件…

Android控件WebView实现完整截图

最近总能看到好多APP都支持文章和网页的长截图,出于好奇研究了一下,分享给大家。 网上有好多的例子,其中好多都是已经过时的就不在复述了,我发现有一种还是比较通用的方法。 //android 5.0 之后需要开启浏览器的整体缓存才能截取…

后端程序员入门react笔记(四)-综合运用,写一个小demo

样式模块化 有时候我们会遇到这样的问题,有两个css对一个class声明了样式,这样的话后引入的css会覆盖前面的css样式,导致样式冲突,那么我们怎么解决这种问题呢,我们可以使用样式的模块化,我们起名一个inde…

关于HashMap的面试问题(26问面试题)

文章目录 关于HashMap的面试问题1、HashMap的底层实现2、HashMap的数组的元素类型3、为什么要使用数组?4、HashMap的数组的初始化长度5、HashMap的映射关系的存储索引index如何计算6、HashMap 为什么使用 &按位与运算代替%模运算?7、为什么要使用has…

微服务篇之限流

一、为什么要限流 1. 并发的确大(突发流量)。 2. 防止用户恶意刷接口。 二、限流的实现方式 1. Tomcat限流 可以设置最大连接数,但是每一个微服务都有一个tomcat,实现起来非常麻烦。 2. Nginx限流 (1)控…

解决IDEA git 提交慢的问题

文章目录 前言解决IDEA git 提交慢的问题 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!! 解…

路由器的端口映射如何设置?

路由器的端口映射设置是网络连接中常用的配置功能,通过将外部网络访问请求映射到内部设备,实现局域网内设备的远程访问。本文将介绍如何进行路由器的端口映射设置,并以【天联】组网产品为例进行说明。 【天联】组网产品介绍 【天联】组网是一…

jenkins报错:Pseudo-terminal will not be allocated because stdin is not a terminal

jenkins的流水线部分代码如下 sh ssh root192.168.2.234 << remotessh cd /var/lib/jenkins/workspace/txkc /usr/local/maven/apache-maven-3.8.6/bin/mvn clean package -U ls remotessh执行流水线出现报错&#xff1a;Pseudo-terminal will not be allocated because…

汽车制造5G智能工厂数字孪生可视化平台,推进汽车行业数字化转型

汽车制造5G智能工厂数字孪生可视化平台&#xff0c;推进汽车行业数字化转型。在当今数字化时代&#xff0c;汽车行业正面临着前所未有的挑战和机遇。随着5G技术的快速发展&#xff0c;汽车制造正在向智能化、数字化转型&#xff0c;而数字孪生技术作为这一转型的核心驱动力&…

数据仓库【指标体系】

指标体系是将零散单点的具有相互联系的指标&#xff0c;系统化的组织起来&#xff0c;通过单点看全局&#xff0c;通过全局解决单点的问题。它主要是由指标和体系两部分组成。 指标是指将业务单元细化后量化的度量值&#xff0c;它使得业务目标可描述、可度量、可拆解&#xff…

谷粒商城篇章9 ---- P248-P261/P292-P294 ---- 消息队列【分布式高级篇六】

目录 1 消息队列(Message Queue)简介 1.1 概述 1.2 消息服务中两个重要概念 1.3 消息队列主要有两种形式的目的地 1.4 JMS和AMQP对比 1.5 应用场景 1.6 Spring支持 1.7 SpringBoot自动配置 1.7 市面上的MQ产品 2 RabbitMQ 2.1 RabbitMQ简介 2.1.1 RabbitMQ简介 2…

在UE5中制作UI环形进度条

在日常开发中&#xff0c;经常会有环形进度条UI的效果&#xff0c;例如技能CD时间、加载动画等&#xff0c;本文将通过材质球节点实现该效果&#xff0c;相较于准备美术素材&#xff0c;这样的做法更为方便&#xff0c;效果如下&#xff1a; 1.制作环状效果材质函数 在内容面…

SAP PP学习笔记03 - SAP中如何设定项目选择

上次这篇文章里面讲了界面的字段显示顺序及是否显示的设置。 并做了 事务代码 控制界面显示的例子。 SAP PP学习笔记02 - PP中配置品目Master时的顺序-CSDN博客 那么&#xff0c;每次控制界面显示什么都要这么挨个 这么设置一遍吗&#xff1f; 那岂不得烦死。 其实SAP里面参…

gitlab,从A仓库迁移某个工程到B仓库,保留提交记录

从A仓库&#xff0c;拷贝 git clone --bare ssh://git192.168.30.88:22/framework/platform.git 在B仓库新建工程&#xff0c;注意&#xff1a;一定要去掉默认的生成README文件进入platform.git 文件夹下&#xff0c;推送到B仓库 git push --mirror ssh://git192.168.30.100…

Stable Diffusion——文生图界面参数讲解与提示词使用技巧

Clip终止层数 什么是Clip CLIP&#xff08;Contrastive Language-Image Pretraining&#xff09;是由OpenAI于2021年开发的一种语言图像对比预训练模型。其独特之处在于&#xff0c;CLIP模型中的图像和文本嵌入共享相同的潜在特征空间&#xff0c;这使得模型能够直接在图像和文…

嵌入式培训机构四个月实训课程笔记(完整版)-Linux ARM驱动编程第八天-高级驱动framebuffer(物联技术666)

链接&#xff1a;https://pan.baidu.com/s/1cd7LOSAvmPgVRPAyuMX7Fg?pwd1688 提取码&#xff1a;1688 帧缓冲&#xff08;framebuffer&#xff09;设备应用于linux显示技术方面。因为linux的显示平台已经全部基于framebuffer&#xff0c;所以目前在linux环境下开发图形化界面、…

电脑死机卡住怎么办 电脑卡住鼠标也点不动的解决方法

在我们使用电脑的过程中,可能由于电脑硬件或者软件的问题,偶尔会出现电脑卡住的情况,很多电脑小白都不知道电脑卡住了怎么办,鼠标也点不动,键盘也没用,一旦发生了这种情况,大家可以来参考一下小编分享的电脑死机卡住的解决方法。 电脑卡住鼠标也点不动的解决方法 方…

java替换jar中的class文件

1、编译好class文件2、找到需要修改class文件的路径3、解压需要替换的文件4、上传编译后的class文件5、重新压缩 在调整java代码过程中会遇到需要改jar包中的class文件的情况&#xff0c;改了如何替换呢&#xff1f; 1、编译好class文件 将需要修改的class文件代码复制到java编…

亿道丨三防平板丨加固平板丨三防加固平板丨改善资产管理

库存资产管理中最重要的部分之一是准确性&#xff1b;过时的库存管理技术会增加运输过程中人为错误、物品丢失或纸张损坏的风险。如今随着三防平板电脑的广泛使用&#xff0c;库存管理也迎来了好帮手&#xff0c;通过使用三防平板电脑能够确保库存管理、数据存储和记录保存的准…

R语言【base】——abs(),sqrt():杂项数学函数

Package base version 4.2.0 Description abs(x) 计算 x 的绝对值&#xff0c;sqrt(x) 计算 x 的正平方根。 Usage abs(x) sqrt(x) Arguments 参数【x】&#xff1a;一个数值或复数向量或数组。 Details 这些都是内部泛型原语函数:可以为它们单独定义方法&#xff0c;也可以…