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

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

 


题目

传送门:https://leetcode.cn/problems/binary-tree-maximum-path-sum/


 


算法设计:深度优先搜索

最大路径和,从哪里来呢?

  • 从根节点
  • 从根节点 + 左子树
  • 从根节点 + 右子树

这是根节点情况。

因为题目说,是从任意节点到任意节点,不是固定从根节点开始的。最大路径和如下图所示:

最大路径和,从哪里来呢?

  • 从根节点 root->val
  • 从根节点 + 左子树 root->val + dfs(root->left)
  • 从根节点 + 右子树 root->val + dfs(root->right)
  • 从左子树 + 根节点 + 右子树(从子树而来)dfs(root->left) + root->val + dfs(root->right)
  • 取这 4 个中的最大值

题目还有一个特别限制,同一个节点在一条路径序列中只能出现一次。

核心是注意当前节点的最大路径,与当前节点作为子节点时的贡献是两个不同的值。

  • 当前节点的最大路径: max(自己,自己+左边,自己+右边,自己 + 左边 + 右边)
  • 当前节点作为子节点时的贡献:max(自己,自己+左边,自己+右边)

后者相对前者,少了左右都存在的情况。

因为作为子节点时,一条路如果同时包含左右,根就被包含了2次,不符合题目只出现一次的限制了。

class Solution {
public:
    int maxPathSum(TreeNode* root) {
        int ans = INT_MIN;
        dfs(root, ans);
        return ans;
    }

    int dfs(TreeNode* root, int& ans){
        if(root == NULL) return 0;
        int leftBS = root->val + dfs(root->left, ans);
        int rightBS = root->val + dfs(root->right, ans);
        ans = max({ans, root->val, leftBS, rightBS, leftBS + rightBS - root->val});   // 最大路径和,从哪里来?
        return max({leftBS, rightBS, root->val});                                     // 去自己+左边+右边的情况,避免重复
    }
};
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值