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. 二叉树中的最大路径和的主要内容,如果未能解决你的问题,请参考以下文章
文本左右对齐(字符串模拟)螺旋矩阵 II(数组矩阵)二叉树中的最大路径和(树深度优先搜索)