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

Posted Debroon

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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);                                     // 去自己+左边+右边的情况,避免重复
    
;

以上是关于124. 二叉树中的最大路径和的主要内容,如果未能解决你的问题,请参考以下文章

124. 二叉树中的最大路径和/104. 二叉树的最大深度

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

文本左右对齐(字符串模拟)螺旋矩阵 II(数组矩阵)二叉树中的最大路径和(树深度优先搜索)

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

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

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