二叉树中的最大路径和
- 题解1 DFS
二叉树中的 路径被定义为一条节点序列,序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次。该路径 至少包含一个节点,且不一定经过根节点。
路径和 是路径中各节点值的总和。
给你一个二叉树的根节点 root
,返回其 最大路径和 。
提示:
- 树中节点数目范围是 [ 1 , 3 ∗ 1 0 4 ] [1, 3 * 10^4] [1,3∗104]
- -1000 <=
Node.val
<= 1000
题解1 DFS
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
int val = INT_MIN;
public:
// 自底向上构建,每个结点返回自己的贡献值
// 比自上向下要节省时间
int dfs(TreeNode* root){
// 0 ——避开INT_MIN + INT_MIN
if(! root) return 0;
// 呼应 0(意义:值为非正无贡献)
// 左树贡献
int l = max(0, dfs(root->left));
// 右树贡献
int r = max(0, dfs(root->right));
// 返回值是关键:
// l+r+root->val 是以当前此结点为起点的路径 的最大值
val = max(val, l+r+root->val);
// KEY !!!!!!!!!!!
// max(l, r): 因为程序栈LIFO,即从高一层的root往下走,不能重复经过某一结点
// 所以结点贡献值是要选择左右子树某一棵
return root->val+max(l, r);
}
int maxPathSum(TreeNode* root) {
dfs(root);
return val;
}
};