【leetcode】【剑指offer Ⅱ】051. 节点之和最大的路径

问题描述:

  • 路径被定义为一条从树中任意节点出发,沿父节点、子节点连接,达到任意节点的序列。
    • 同一个节点在一条路径序列中至多出现一次。
    • 该路径至少包含一个节点,且不一定经过根节点。
    • 路径和是路径中各节点值的总和。
  • 给定一个二叉树的根节点 root,返回其最大路径和,即所有路径上节点值之和的最大值。
    • 节点的取值范围为 [-1000, 1000]

核心思路:

  • 该题是二叉树相关题目中较难的一类,需要考虑的情况较多。
  • 首先理解在每个节点如何更新最大路径和。
    • 外部维护一个结果变量 ans 记录最大路径和。
    • 在当前节点 cur 取得左右子的最大路径和,即 l = dfs(cur->left), r = dfs(cur->right)
    • 那么在当前节点可以判断得到的最大路径和为 cur->valcur->val + lcur->val + rcur->val + l + r 其中的一种,即 ans = max(ans, cur->val, cur->val + l, cur->val + r, cur->val + l + r)
    • 之所以出现四种情况,是因为 lr 可能出现负值。
    • 这里就可以用一个方法来简化答案,当 lr 是负数时,将其置为 0 视为不拼接路径,即 l = max(0, dfs(cur->left)), r = max(0, dfs(cur->right)),此时更新 ans 的代码变得更简洁了,即 ans = max(ans, cur->val + l + r)
  • 最后递归函数返回的是可以传递给父节点的路径和,传递给父节点就意味着路径向上延申,因此只可能是 cur->val + lcur->val + r 的一种,取两者的最大值即可。

代码实现:

class Solution
{
private:
    int ans = INT_MIN;
    int dfs(TreeNode* root)
    {
        if(!root) return 0;
        int l = max(0, dfs(root->left));
        int r = max(0, dfs(root->right));
        ans = max(ans, l + r + root->val);
        return max(l + root->val, r + root->val);
    }
public:
    int maxPathSum(TreeNode* root)
    {
        dfs(root);
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值