题目描述
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.
思路:这一题主要避过路径必包含子树根节点这个坑就行,比如对于{-2,-1}则最小路径不是-1,而是-2.
-2
/
-1
每种递归包含三种情况:
1. 一种是只包含根节点ptr->val,此时左右子树最大路径和均为负
2. 一种是只包含根节点和一个正的子树路径和
3. 一种是包含根节点和两个正的子树路径和
因此参考代码如下所示:
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
int ans;
public:
int maxPathSum(TreeNode *root) {
if(root==nullptr)
return 0;
ans=-10000;
int res=seekans(root);
return max(res,ans);
}
private:
int seekans(TreeNode *ptr)
{
if(ptr==nullptr)
return 0;
int r_val=ptr->val;
int lval=seekans(ptr->left);
int rval=seekans(ptr->right);
int subval=max(lval,rval);
ans=max(ans,r_val+lval+rval);//第三种情况
ans=max(ans,r_val);//第一种情况
ans=max(ans,r_val+subval);//第二种情况
int subres=ptr->val+subval;//对于每一个子树,返回包含该子树顶点的深度方向的路径和的最大值。
return max(ptr->val,subres);
}
};