原题:给定一棵二叉树,每个节点有一个数字代表路径值。找出最长路径。(路径不必穿过树根)
解法:先找以各个节点作为子树的最长路径(路径必须经过根)。要么就是根到左子树的某个节点,要么就是根到右子树的某个节点,要么就是穿过根(从左到右),要么就是根节点本身。用ans维护最长路径,用findPath表示不穿过根的路径最大值(向上返回用)。代码如下:
/**
* 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 ans;
int findMax(TreeNode * root)
{
int left,right,temp;
left=right=temp=INT_MIN/2;
ans=max(ans,root->val);
if(root->left==NULL && root->right==NULL) return root->val;
if(root->left!=NULL) left=findMax(root->left);
if(root->right!=NULL) right=findMax(root->right);
ans=max(max(ans,root->val),max(left+root->val,right+root->val));
ans=max(ans,left+right+root->val);
if(left>right) return max(root->val,left+root->val);
return max(root->val,right+root->val);
}
int maxPathSum(TreeNode* root) {
TreeNode *temp=root;
ans=INT_MIN/2;
findMax(root);
return ans;
}
};