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

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

5个月前 (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)(递归空间)。适用于需要求解树中任意路径最值的场景,体现了算法设计与问题转化的精髓。


原创内容 转载请注明出处

分享给朋友:

相关文章

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

力扣第654题:最大二叉树解题教程 用数组构造最大二叉树

题目解读给定一个不含重复元素的整数数组,我们需要构建一棵最大二叉树。构建规则是:数组中的最大值作为根节点,其左侧子数组构建左子树,右侧子数组构建右子树,然后递归地应用这个规则。这种构建方式体现了分治思...

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

牛客DP41精讲:当背包必须装满时,你的状态转移方程该如何调整?

题目重解我们面对一个经典背包问题的变体:给定n个物品,每个物品有重量w和价值v,背包容量为V。需要回答两个问题:1) 普通情况下能获得的最大价值;2) 必须恰好装满背包时的最大价值(若无法装满则输出0...

力扣654:递归分治的艺术 如何用最大元素构建二叉树

力扣654:递归分治的艺术 如何用最大元素构建二叉树

题目重解我们面对一个看似简单却充满递归魅力的题目:给定一个不含重复元素的整数数组,需要构建一棵特殊的二叉树。这个树的每个父节点都必须是当前子数组中的最大元素,而它的左右子树则分别由该最大值左侧和右侧的...

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

NOIP2005 普及组 洛谷P1408 背包问题的空间优化技巧与实战应用

题目重解想象你是一名药师,有t分钟在山上采集m种草药。每种草药需要time分钟采集,价值为num。这就像考试时分配时间做题,要选择收益最大的题目组合。题目要求计算在规定时间内能获得的最大草药价值。解题...

力扣94:递归之美 轻松掌握二叉树中序遍历

力扣94:递归之美 轻松掌握二叉树中序遍历

题目解读二叉树的中序遍历是一种基础且重要的树遍历方式,其遍历顺序为:先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树。对于二叉搜索树,中序遍历的结果恰好是节点值的升序排列。给定一个二叉...

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

GESP2023年六级真题解析:动态规划解决小杨买饮料问题(洛谷3873)

一、题目解读小杨买饮料是GESP 2023年六级认证考试中的一道经典动态规划题目,考察学生对背包问题的理解和应用能力。题目描述小杨需要购买n种饮料,每种饮料有特定的体积w和价格v,他要在不超过容量l的...

发表评论

访客

看不清,换一张

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