描述
给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。
这个路径的开始节点和结束节点可以是二叉树中的任意节点
例如:
给出以下的二叉树,
返回的结果为6
示例1
输入:
{-2,1}
返回值:
1
示例2
输入:
{-2,#,-3}
返回值:
-2
定义一个中间变量:节点最大贡献值 = node->val + max(left_num + right_num);
表示如果该节点不为根节点时,走过该节点的路径能获得的最大贡献值。
经过节点A的最大路径值 = 左子树最大贡献值 + 右子树最大贡献值 + A->val;
深搜计算最大贡献值,同时进行储存比较即可。
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
#include <algorithm>
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型
*/
int max_sum = INT_MIN;
int max_num(TreeNode *root){
if (!root) return 0;
int left_num,right_num;
left_num = max_num(root->left);
left_num = left_num > 0? left_num:0;
right_num = max_num(root->right);
right_num = right_num > 0? right_num:0;
int root_num = root->val + left_num + right_num;
if (root_num > max_sum) {
max_sum = root_num;
}
return root->val + max(left_num, right_num);
}
int maxPathSum(TreeNode* root) {
// write code here
max_num(root);
return max_sum;
}
};