转载 :http://blog.youkuaiyun.com/fly_yr/article/details/50412751
对任意一个节点,当前节点值cur,
左子树,一条路径值 > 0 , cur += left
右子树,一条路径值 > 0 , cur += right
这样可以可以遍历求得最大的路径和。
ac代码
/**
* 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 {
public:
int INF = 0x7fffffff;
int MIN_INF = -INF-1;
int maxVal;
int dfs(TreeNode* root)
{
if(root == NULL)
return 0;
else{
int leftM = dfs(root->left);
int rightM = dfs(root->right);
int rootVal = root->val;
int cur = rootVal;
if(leftM > 0)
cur += leftM;
if(rightM > 0)
cur += rightM;
if(cur > maxVal)
maxVal = cur;
return max(rootVal, max(rootVal+leftM, rootVal+rightM));
}
}
int maxPathSum(TreeNode* root) {
if(root == NULL)
return 0;
maxVal = MIN_INF;
dfs(root);
return maxVal;
}
};
注意递归思路
求二叉树中两个节点之间的最大距离。
(1)如果二叉树为空,返回0
(2)如果二叉树不为空,最大距离要么是左子树中的最大距离,要么是右子树中的最大距离,要么是左子树节点中到根节点的最大距离+右子树节点中到根节点的最大距离
思路同上,代码也同上,只不过要换成距离(也就是深度)