Binary Tree Maximum Path Sum

弄清楚这道题中的path指的是什么是成功的关键。我就是在没弄清楚题意的情况下做了半天无用功。。。

这里的path指的是从树中的一个节点开始,沿着边走到另一个节点位置,所经历的所有节点组成一个path,同一个节点不能在path中出现2次,其实就是图中的path。


程序主体主需要对树进行一次dfs即可,在每个节点都要做一个决策:是否要从当前节点继续沿parent路径往上返回;如果返回,则最佳路径的决策留待上层解决;如果不返回,那么在当前节点处解决最佳路径。

pathStart返回的是以参数root为path的一端,另一端在root以下寻找,所能找到的最佳路径。

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    int res;
    int pathStart(TreeNode* root)
    {
        if((root->left==NULL)&&(root->right==NULL))
        {
            if(root->val>res)
            {
                res=root->val;
            }
            return root->val;
        }
        int tmp=root->val;//save the value need to be further checked along parent path
        int curVal=root->val;//save the value do not need to be further checked along parent path
        if(root->left!=NULL)
        {
            //extend to left child
            int v=pathStart(root->left);
            if(v>=0)
            {
               if((root->val+v)>tmp)
               {
                   tmp=root->val+v;
               }
               curVal+=v;
            }
        }
        if(root->right!=NULL)
        {
            //extend to right child
            int v=pathStart(root->right);
            if(v>=0)
            {
               if((root->val+v)>tmp)
               {
                   tmp=root->val+v;
               }
               curVal+=v;
            }
        }
        if(curVal>res)
        {
            res=curVal;
        }
        //extend to parent
        return tmp;
    }
    int maxPathSum(TreeNode *root) {
        res=-(1<<31);
        if(root==NULL)
        {
            return 0;
        }
        int tmp=pathStart(root);
        if(tmp>res)
        {
            res=tmp;
        }
        return res;
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值