【leetcode】124. 二叉树中的最大路径和

题目

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。

思路

这个题目,一开始我是没有思路的,一脸懵逼。
最初想着是搜索去解决,但是结果不一定经过根节点,然后我就没有思路了。
那简化一下问题,如果是答案一定经过根节点,那递归求解就很简单了。
不过深究一下递归求解过程中的函数的定义,该函数是可以求出以该节点为根节点的最值,仅仅而已。
问题在于,如何将子问题合并成原问题的解。
最优解有两种情况,

  1. 左子树 + 根 + 右子树
  2. 左子树和右子树较大的 + 根

问题又来了,对于 左子树 + 根 + 右子树 得出的最优解,并不属于其父节点的最优解的包含下的。
而只有 左子树和右子树较大的 + 根 是属于其父节点的最优解的包含下的。

那么像这种非父节点的最优解的包含下的情况左子树 + 根 + 右子树 我们可以用一个全局变量来保存。
那么代码就很容易的写出来了

代码

class Solution {
private:
    int ret = INT_MIN;
    int getMax(TreeNode * root) {
        if (root == nullptr) return 0;
        int left = max(0, getMax(root->left));
        int right = max(0, getMax(root->right));
        ret = max(ret, root->val + left + right);
        return max(left, right) + root->val; 
    }
public:
    int maxPathSum(TreeNode* root) {
        return max(ret, getMax(root));
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值