Binary Tree Maximum Path Sum--一次没A过的题

来源:互联网 发布:类似p2p的软件 编辑:程序博客网 时间:2024/05/01 12:13

题目大意

     求一棵树上任意两节点之间路径和的最大值

解题思路

    很容易想到树形DP对吧,我觉得应该属于简单的树形DP,唯一要注意的是题目说是路径,那就只会有唯一的一个起点和终点(可能相同),显然对于树上DP到的当前节点,可以分为以下两种种情况考虑:

    1、当前节点为某一路径上的点,即当前节点连接其子节点和父节点,那么就应该用当前节点的val加上其左右子树较大的那一个值,然后返回更新后的状态,向上回归。

   2、当前节点作为连接两棵子树的节点,那么它和其左右子树构成一条路径(与父节点无关),(代码中的maxx)记录其路径和并找到最大,显然这种情况不应当回归到父节点而是直接成为可行解。

这样的思路就十分清晰了,还有一些细节需要注意,比如考虑到当前节点可能为负数,故要其左(右)子树也可能构成可行解、每一个独立的节点可以构成可行解。

总结

      还是细节问题,考虑到上述全部提到的细节,1Y应该是没有问题的,至于你有没有1Y,我反正是没有的T-T。。。

代码

class Solution {public:    int maxx = INT_MIN;    int getMaxPathSum(TreeNode *cur)     {        if (cur->left==NULL && cur->right==NULL)  return cur->val;        int left_val = -1*(1<<30), right_val = -1*(1<<30);//这里不能取最小,会溢出,因为有加运算        if (cur->left != NULL) left_val = getMaxPathSum(cur->left);        if (cur->right != NULL) right_val = getMaxPathSum(cur->right);        maxx = max(left_val+right_val+cur->val, max(cur->val,maxx));        maxx = max(left_val, maxx);        maxx = max(right_val, maxx);        return max(cur->val,cur->val+max(left_val,right_val));            }    int maxPathSum(TreeNode *root)     {        maxx = INT_MIN;        int ans = getMaxPathSum(root);        return max(ans, maxx);         }};


0 0
原创粉丝点击