当前位置: 首页 > news >正文

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

题目

思路

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

首先设计一个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);
    }
};

相关文章:

  • 深入了解 Python 中的 MRO(方法解析顺序)
  • Docker搭建基于Rust语言的云原生可观测平台OpenObserve
  • sklearn中的决策树-分类树:剪枝参数
  • PMP项目管理—整合管理篇—7.结束项目或阶段
  • 【Kubernetes】API server 限流 之 maxinflight.go
  • 跨AWS账户共享SQS队列以实现消息传递
  • SQL Server 视图的更新排查及清除缓存
  • Protobuf原理与序列化
  • 高数1.1 函数
  • 深度学习-11.用于自然语言处理的循环神经网络
  • Spring Boot集成Spring Security之HTTP请求授权
  • C++11智能指针
  • 细说 Java GC 垃圾收集器
  • springBoot统一响应类型3.1版本
  • 高举高打,阶跃星辰冲刺商业化
  • 【JavaSE-1】初识Java
  • 【Godot_4.3】预加载preload失败
  • Windows 11【1001问】删除Win11左下角小组件的6种方法
  • 【Jenkins】个人向-Jenkinsfile如何写
  • Axure PR 9 中继器 03 翻页控制
  • 外国游客“在华扫货”热:“带空箱子到中国!”
  • 普京提议重启俄乌直接谈判后,特朗普表态了
  • 让“五颜六色”面孔讲述上海故事,2025年上海城市推荐官开启选拔
  • 5天完成1000多万元交易额,“一张手机膜”畅销海内外的启示
  • 白宫启动“返乡计划” ,鼓励非法移民自愿离开美国
  • 秦洪看盘|交易型资金收缩,释放短线压力