力扣HOT100之二叉树:124. 二叉树中的最大路径和

这道题是困难题,靠自己想还是挺难想的,还是去看的灵神的题解,感觉还是要多复习一下这道题。这道题的思路和之前做的543. 二叉树的直径很像,可以参考之前的这篇博客。这里我们还是用递归来做,定义一个lambda函数来实现递归遍历,还是同样的思路,我们遍历所有节点,计算当以该节点为拐点的时候所能取到的最大路径和 (必须要取,哪怕最大路径和为负数也必须取一个最大的负数),我们分别对左孩子节点和右孩子节点调用递归函数,计算各自的最大直链和,然后相加,再加上根节点存储的值,然后与当前的最大路径和作比较,较大结果保存在一个外部变量result中,但是该函数不返回result,而是返回包括当前节点在内的最大直链和与0的较大值,因为这道题的最大路径和并不一定要以叶子节点为起点或者终点,所以包含当前节点的直链和出现负数时,我们可以直接丢弃,重新从0开始计算。

cpp 复制代码
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    int maxPathSum(TreeNode* root) {
        int result = INT_MIN;
        auto dfs = [&] (this auto&& dfs, TreeNode* root) -> int{
            if(!root) return 0;
            //左
            int left_max = dfs(root -> left);
            //右
            int right_max = dfs(root -> right);
            //中
            result = max(result, left_max + right_max + root -> val);
            return max(max(left_max, right_max) + root -> val, 0);
        };
        dfs(root);
        return result;
    }
};
相关推荐
weixin_307779133 小时前
C++代码实现MATLAB中的dlarray函数功能
开发语言·c++·算法·matlab
hetao17338378 小时前
2026-10-03~04 hetao1733837 的刷题记录
c++·算法
Zootopia6269 小时前
飞行力学知识梳理1|飞行性能与稳定性
人工智能·python·算法·机器学习·无人机·学习方法·信息与通信
longlongzihan9 小时前
从LeetCode 70. 爬楼梯看动态规划:如何精准推导状态转移方程?
c++·算法·leetcode·动态规划
2601_9603563810 小时前
2027校招采购岗解析:数学基础如何迁移到需求预测、成本与供应商分析
人工智能·算法
h_a_o777oah10 小时前
【树论】树链剖分:将树形结构转化为线性结构以处理树上路径问题(洛谷 P3384 附C++代码模板)
数据结构·算法·线段树·acm·树链剖分·树论·重链剖分
HEJOO910 小时前
指针的算术运算详解
java·数据结构·算法
Coder-magician10 小时前
《代码随想录》刷题打卡day47:并查集-part01
数据结构·算法·图论
垆边人似月.11 小时前
VLAN 资源池(100~200 分档)
数据结构·算法
潼心1412o11 小时前
C++初阶(长期更新)第6讲:类和对象(下)
开发语言·c++·算法