算法与数据结构(二叉树中的最大路径和)

ops/2025/3/1 2:33:38/

题目

思路

这道题我们可以考虑用递归来解决。

首先设计一个maxPath函数用来递归计算二叉树中一个节点的最大贡献值,具体来说,就是以该节点为根节点的子树中寻找以该节点为起点的一条路径,使得该路径上的节点值之和最大。

如果该节点为空,则最大贡献值为0。

如果非空,最大贡献值就等于节点值与其子节点中的最大贡献值之和

过程分析

假设二叉树如下

递归步骤:

1. 节点 20

  1. 左子树:空,leftGain = 0。
  2. 右子树:空,rightGain = 0。
  3. sum = 20 + 0 + 0 = 20。
  4. 更新 maxsum = max(INT_MIN, 20) = 20。
  5. 返回 20 + max(0, 0) = 20。

2. 节点 1

  1. 左子树:空,leftGain = 0。
  2. 右子树:节点 3。

节点 3:

  1. 左子树:空,leftGain = 0。
  2. 右子树:空,rightGain = 0。
  3. sum = 3 + 0 + 0 = 3。
  4. 更新 maxsum = max(20, 3) = 20。
  5. 返回 3 + max(0, 0) = 3。
  1. rightGain = 3。
  2. sum = 1 + 0 + 3 = 4。
  3. 更新 maxsum = max(20, 4) = 20。
  4. 返回 1 + max(0, 3) = 4。

3.  节点 2

  1. 左子树:节点 20,leftGain = 20。
  2. 右子树:节点 1,rightGain = 4。
  3. sum = 2 + 20 + 4 = 26。
  4. 更新 maxsum = max(20, 26) = 26。
  5. 返回 2 + max(20, 4) = 22。

4.  节点 10(根节点)

  1. 左子树:节点 2,leftGain = 22。
  2. 右子树:节点 10。

节点 10:

左子树:空,leftGain = 0。

右子树:节点 -25。

节点 -25:

左子树:空,leftGain = 0。

右子树:空,rightGain = 0。

sum = -25 + 0 + 0 = -25。

更新 maxsum = max(26, -25) = 26。

返回 -25 + max(0, 0) = -25。

rightGain = 0(因为 -25 是负数,被置为 0)。

sum = 10 + 0 + 0 = 10。

更新 maxsum = max(26, 10) = 26。

返回 10 + max(0, 0) = 10。

rightGain = 10。

sum = 10 + 22 + 10 = 42。

更新 maxsum = max(26, 42) = 42。

返回 10 + max(22, 10) = 32。

最大路径和为 42,路径为 20 -> 2 -> 10 -> 10

代码

class Solution {
private:int maxsum = INT_MIN;
public:int maxPathSum(TreeNode* root) {maxPath(root);return maxsum;}int maxPath(TreeNode* node){    if(node == nullptr)return 0;int leftGain = max(maxPath(node->left),0);int rightGain = max(maxPath(node->right),0);int sum = node->val + leftGain + rightGain;maxsum = max(maxsum,sum);return node->val + max(leftGain, rightGain);}
};


http://www.ppmy.cn/ops/162114.html

相关文章

docker和k8s

1. docker的几种网络模式 1.1. bridge模式(默认) container有自己的ip,它的ip映射到主机的docker0这个虚拟网卡上,它们能访问外网,外网不能访问它们(外网要访问,可以加通过端口映射&#xff0…

【缓冲区】数据库备份的衍生问题,缓冲区是什么,在哪里?(一)

【缓冲区】数据库备份的衍生问题,缓冲区是什么,在哪里?(一) 缓冲区是操作系统和 Java 运行时环境(JVM)内部的一个机制,你无法直接看到它,因为它是由操作系统和 JVM 管理…

Scala Trait(特征)

Scala Trait(特征) Scala 语言作为一种多范式编程语言,结合了面向对象和函数式编程的特性。在 Scala 中,Trait 是一种非常灵活的抽象机制,类似于 Java 中的接口和 C++ 中的类混合。本文将详细介绍 Scala 中的 Trait,包括其定义、使用方法以及与类的关系。 什么是 Scala…

智能优化算法:雪橇犬优化算法(Sled Dog Optimizer,SDO)求解23个经典函数测试集,MATLAB

一、雪橇犬优化算法 算法简介:雪橇犬优化算法(Sled Dog Optimizer,SDO)是2024年10月发表于JCR1区、中科院1区SCI期刊《Advanced Engineering Informatics》的新型仿生元启发式算法。它模拟雪橇犬的拉雪橇、训练和退役行为构建模型…

【Docker】Linux部署web版Firefox

秉着万物皆可docker的原则,浏览器能否docker呢?有一天,lz想下载某个插件时发现打不开网址,一看发现原来是google的地址。浏览器打不开谷歌。很正常对吧,但是这个正常的事件发生在我这个不正常的人身上,这本…

Element Plus中el-select选择器的下拉选项列表的样式设置

el-select选择器,默认样式效果: 通过 * { margin: 0; padding: 0; } 去掉内外边距后的样式效果(样式变丑了): 通过 popper-class 自定义类名修改下拉选项列表样式 el-select 标签设置 popper-class"custom-se…

C++ 红黑树万字详解(含模拟实现(两种版本))

目录 红黑树的概念 红黑树的性质 红黑树的删除 红黑树与AVL树的比较 红黑树的应用 红黑树的模拟实现 红黑树的概念 红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。 通过对任何一条从根到叶…

姿态矩阵/旋转矩阵/反对称阵

物理意义,端点矢量角速率叉乘本身向量; 负号是动系b看固定系i是相反的; 一个固定 在惯性导航解算中,旋转矢量的叉乘用于描述姿态矩阵的微分方程。你提到的公式中, ω i b b \boldsymbol{\omega}_{ib}^b \times ωibb…