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


原创内容 转载请注明出处

分享给朋友:

相关文章

CSP-J方格取数题解|动态规划解法|洛谷P7074代码解析

CSP-J方格取数题解|动态规划解法|洛谷P7074代码解析

一、题目解读题目要求在一个n×m的网格中,从左上角到右下角选择一条路径,路径上的数字可重复取用,求取数之和的最大值。路径限制为仅能向右或向下移动。需注意路径的灵活性与重复取数的可能性,传统单向动态规划...

牛客12576题解题全解析:动态规划+质因数分解实现跳跃问题最优解

牛客12576题解题全解析:动态规划+质因数分解实现跳跃问题最优解

一、题目解读牛客12576题是一道经典的算法题,要求给定起点N和终点M,求解从N到M的最少跳跃次数。题目考察的核心在于路径优化与动态规划思想,需结合数论中的质因数分解技巧,通过合理设计算法降低时间复杂...

【CSP-S 2019】括号树(洛谷P5658)解题报告:栈+DFS+异或优化详解

【CSP-S 2019】括号树(洛谷P5658)解题报告:栈+DFS+异或优化详解

一、题目解读括号树问题(洛谷P5658)要求处理一个由括号序列转化的树结构:每个节点表示一个括号,'('为子节点,')'为父节点。题目给定一棵n个节点的树,需计算每个节...

洛谷P4551题解题报告:图论与Trie树优化异或路径问题的实战解析

洛谷P4551题解题报告:图论与Trie树优化异或路径问题的实战解析

一、题目解读洛谷P4551题要求在一个无向图中,寻找任意两点路径权值异或后的最大值。题目输入为图的边信息(点数n和n-1条边),每条边包含起点、终点及权值。需输出所有路径中权值异或的最大值。问题核心在...

CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解

CSP-J 2019公交换乘题解析:基于队列优化的动态规划代码详解

一、题目解读CSP-J 2019年的“公交换乘”题目(洛谷P5661)要求模拟地铁与公交交替出行的费用计算。题目核心在于地铁消费会产生优惠券,而公交可在45分钟内使用优惠券抵扣车费。需要处理n条出行记...

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

洛谷P4999题解析:动态规划求解数字拆分与求和问题(附代码)

一、题目解读洛谷P4999题要求处理给定区间 [L, R] 内数字的拆分与求和问题。每个数字需拆分为其各位数字之和,并计算区间内所有数字之和的累加结果。题目需考虑大数情况,并采用取模运算(MOD=1e...

发表评论

访客

看不清,换一张

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