原题
https://leetcode.com/problems/binary-tree-maximum-path-sum/。
Given a binary tree, find the maximum path sum.
The path may start and end at any node in the tree.
For example:
Given the below binary tree,
1
/ \
2 3
Return 6.
翻译:在一棵二叉树中找到和最大的一条路径()这条路径起点和终点在二叉树的某个位置就行。
思路
这个问题看到以后其实没什么思路,然后在Discuss中看到了下面的代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
int flag = INT_MIN;
public:
int maxPathSum(TreeNode* root) {
getSum(root);
return flag;
}
int getSum(TreeNode* root)
{
if(root == NULL) return 0;
int a = getSum(root->left);
int b = getSum(root->right);
flag = max(flag , root->val + a + b);
return max(0,root->val + max(a,b));
}
};
然后想了想,果然不错。有必要解释一下这一段代码。
代码解释
看到INT_MIN这种值,肯定就是用来记录最大值的标记。
getSum函数是干什么的呢——他求的是包含root节点的,从root到叶节点的和最大的路径(从root开始,不一定要到叶子节点,甚至可以不包含root),这个路径的最小值是0(大不了不包含任何节点)。
那么函数的语句就可以理解了,return max(0,root->val + max(a,b)),就是返回0或者根节点的值加上两个子树最大的getSum的值。
并且flag = max(flag , root->val + a + b);就是用来不断的刷新可能的最大的值(这里root->val + a + b就是过root的路径的最大值,当然路径可能不过root,getSum(root->left);和getSum(root->right);的时候会进行比较过滤。
可以看出,思路简洁,巧妙!
接下来,我们来讨论讨论话务预测的项目~