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}); // 去自己+左边+右边的情况,避免重复
}
};