MaxPathSum

最早和瞿神合作写了一个比较复杂的版本的,现在打算 重新写,虽然 都是树形DP。

因此,每次调用左右子树的时候,要特别注意是否有一个是树杈行,有O(n)的算法,每次做两件事情,分别是更新基于当前root的path的最大值,四种选最大。

max{f(x.l)+f(x.r)+w(x),f(x.l)+w(x),f(x.r)+w(x),w(x)};

每个节点是递归找两个子树的最大,但是除去两个子树都需要的情况,三种选较大的,不然递归返回回去不能作为 父亲的子问题

最大PathSum

class Solution {
public:
    int maxPath;
    int maxPathSum(TreeNode *root)
    {
        if(!root) return 0;
        maxPath=root->val;
        maxPathNode(root);
        return maxPath;
    }

    int maxPathNode(TreeNode *root)
    {
        if(root==NULL) return 0;
        int leftmax=maxPathNode(root->left), rightmax=maxPathNode(root->right);

        maxPath=max(root->val, max(maxPath,max(leftmax+root->val+rightmax, max(leftmax+root->val, rightmax+root->val))));
        //cout<<maxPath<<endl;
        return max(root->val, max(leftmax+root->val, rightmax+root->val));
    }
};

今天突然发现stack.top() 是返回引用类型,这样的好处是可以S.top()=a; 函数返回值可以作为左值进行赋值操作,后者说cout<<a类似这种可以连续操作

Posted by richard爱闹 - 9月 28 2014
如需转载,请注明: 本文来自 Richard