当前位置:首页 > 牛客 > 牛客125题解:二叉树最大路径和的动态规划解法

牛客125题解:二叉树最大路径和的动态规划解法

7个月前 (09-24)

牛客125题解:二叉树最大路径和的动态规划解法 牛客题解 二叉树 动态规划 后序遍历 递归 树结构 DFS 深度优先搜索 深搜 第1张

一、题目解读

牛客125题要求求解一棵二叉树中节点之间的最大路径和。路径定义为任意两个节点之间的连通路径(无需经过根节点),节点值可正可负。核心在于找到包含节点值之和最大的路径,需考虑子贡献与全局最优解的权衡。

二、解题思路

1. 后序遍历:通过递归遍历二叉树,自底向上计算每个节点的贡献;

2. 动态规划:维护两个值:

○ 当前节点为路径起点的最大路径和(需包含左右子树中较大的贡献);

○ 全局最大路径和(更新所有可能路径中的最大值);

3. 处理负数:若子树贡献为负,则舍弃该子树,避免影响整体路径和。

三、解题步骤

1. 初始化:全局变量max_sum设为INT_MIN,确保首次更新时任何正数均有效;

2. 递归函数DFS

○ 若节点为空,返回0;

○ 递归计算左右子树的最大贡献值left、right,若为负则置为0(舍弃);

○ 计算当前节点作为路径转折点时的路径和:node->val + left + right;

○ 更新全局最大路径和max_sum;

○ 返回当前节点的最大贡献值:node->val + max(left, right)(仅保留单侧最大贡献)。

3. 主函数调用:通过dfs(root)启动递归,最终返回max_sum作为结果。

四、代码与注释

class Solution {
public:
    int maxPathSum(TreeNode* root) {
        max_sum = INT_MIN; // 初始化为最小整数值
        dfs(root);
        return max_sum;
    }
private:
    int max_sum;
    // 后序遍历计算最大路径和
    int dfs(TreeNode* node) {
        if (!node) return 0;
        // 递归计算左右子树的最大贡献值(负数则舍弃)
        int left = max(dfs(node->left), 0);
        int right = max(dfs(node->right), 0);
        // 当前节点作为路径转折点时的路径和
        int current_sum = node->val + left + right;
        max_sum = max(max_sum, current_sum);
        // 返回当前节点的最大贡献值(只能选择左右子树中的一个)
        return node->val + max(left, right);
    }
};

五、总结

本解法通过动态规划与后序遍历的结合,巧妙解决二叉树最大路径和问题。关键在于“自底向上”计算节点贡献,并灵活处理负数情况避免路径恶化。时间复杂度O(n)(遍历所有节点),空间复杂度O(n)(递归空间)。适用于需要求解树中任意路径最值的场景,体现了算法设计与问题转化的精髓。


原创内容 转载请注明出处

分享给朋友:

相关文章

70.爬楼梯|三步破解动态规划核心奥秘

70.爬楼梯|三步破解动态规划核心奥秘

题意新解:站在楼梯底仰望n级台阶,每步可选1或2阶,最终的路径组合犹如斐波那契数列般展开。比如到达第3阶的路径可由第1阶跨两步,或第2阶跨一步构成,这种递推规律揭示了两两相邻状态间的紧密关联。思路解析...

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

【深度优先搜索实战】力扣547题:省份数量问题的图论解法

题目解读‌我们面对的是一个典型的图论问题:给定一个城市的连接矩阵,需要计算其中相互连通的城市群(省份)数量。这个问题可以抽象为无向图中的连通分量计算,每个城市代表图中的一个节点,城市之间的连接关系代表...

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

IOI 1994 洛谷1216:如何用动态规划高效解决数字三角形问题?附完整代码解析

题目重解给定一个由数字组成的三角形结构,从顶部出发,每次可以移动到下方相邻的数字,最终到达底部。我们的目标是找到一条路径,使得路径上经过的数字总和最大。这个问题在实际中有许多应用场景,如最优路径规划、...

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

CSP-J 2019纪念品题解(洛谷P5662):动态规划+完全背包问题的实战应用

一、题目解读2019年CSP-J的“纪念品”问题(对应洛谷P5662)要求玩家在T天内通过买卖纪念品最大化金币收益。每天可交易N种商品,需计算最优策略下的最终金币数。题目强调动态规划思维与资源分配优化...

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

2024蓝桥杯省赛B组“传送阵”题解(C++代码+图论算法优化)

一、题目解读2024年蓝桥杯省B组“传送阵”题目要求处理一个包含n个节点的图,节点间存在单向传输关系。每个节点i可传送至a[i]指定的节点,形成可能存在的环结构。题目需求解从任意节点出发能到达的最长路...

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

LeetCode 120题三角形最小路径和最优解法:动态规划详解与代码实现

一、题目解读LeetCode 120题“三角形最小路径和”要求给定一个由数字组成的三角形,从顶部开始向下移动,每次可向左或向右移动一格,计算从顶至底的最小路径和。三角形以二维向量形式给出,每层元素数量...

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。