题目描述
给定一个二叉树,请计算节点值之和最大的路径的节点值之和是多少。
这个路径的开始节点和结束节点可以是二叉树中的任意节点
例如:
给出以下的二叉树,
返回的结果为6
示例1
输入
{-2,1}
返回值
1
示例2
输入
{-2,#,-3}
返回值
-2
这题有些难,没做出来,看了别人的代码没看懂,后来又看了相关的视频,感觉这里用到了动态规划的思想,树上各结点记录下该结点处的最大路径和,各结点处的最大路径和由于需要继续向上回溯,因此取左子树和右子树中最大路径和较大值加上该结点的值。Max记录整棵树的最大路径和,因此每次用左子树最大路径+右子树最大路径+结点值,如果该值更大,更新Max。
例子:
C++代码:
/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
class Solution {
public:
/**
*
* @param root TreeNode类
* @return int整型
*/
int Max=-1000000; //记录二叉树的最大路径结点值
int maxPathSum(TreeNode* root) {
// write code here
NodeMax(root);
return Max;
}
int NodeMax(TreeNode* root)
{
if (root == NULL)
{
return 0;
}
int left, right;
left = max(0,NodeMax(root->left));
right = max(0,NodeMax(root->right));
Max=max(Max,left+right+root->val);
return max(left,right)+root->val;
}
};
参考网址:
https://www.bilibili.com/video/BV1W7411r7tB?from=search&seid=12755344721986897308
https://blog.nowcoder.net/n/188210410a904a5f9379c27520fc2520?f=comment