// /**
//  * 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 {
    bool b[40005];
    int l[40005],r[40005],s[40005],ma[40005],mi[40005],n,ans;
    //这个函数存储的是下标,将ans作为全局变量,既不作为参数,也不作为返回值,中间空余出来计算空间存放别的数值。
    int work(TreeNode* r)
    {
        if(r==nullptr) return 0;
        int x=++n;
        cout<<"x: "<<x<<endl;
        l[x]=work(r->left);
        r[x]=work(r->right);
        // ma[x]=max(r->val,max(ma[l[x]],ma[r[x]]));
        ma[x]=max(r->val,max(ma[l[x]],ma[r[x]]));
        mi[x]=min(r->val,min(mi[l[x]],mi[r[x]]));
        s[x]=r->val+s[l[x]]+s[r[x]];
        b[x]=b[l[x]]&&b[r[x]]&&(ma[l[x]]<r->val)&&(mi[r[x]]>r->val);
        if(b[x]) ans=max(ans,s[x]);
        return x;
    }
public:
    int maxSumBST(TreeNode* root) {
        //bool 是否是BST,默认根节点是后续才能展开
        b[0]=1;
        ma[0]=-40000;
        mi[0]=40000;
        //n->index,ans->answer,s[0]
        n=ans=s[0]=0;
        work(root);
        return ans;
        
    }
};
// class Solution {
//     bool b[40005];
//     int l[40005],r[40005],ma[40005],mi[40005],s[40005],n,ans;
//     int work(TreeNode* root)
//     {
//         if(root==nullptr)return 0;
//         int x=++n;
//         l[x]=work(root->left);
//         r[x]=work(root->right);
//         ma[x]=max(root->val,max(ma[l[x]],ma[r[x]]));
//         mi[x]=min(root->val,min(mi[l[x]],mi[r[x]]));
//         s[x]=root->val+s[l[x]]+s[r[x]];
//         b[x]=b[l[x]]&&b[r[x]]&&ma[l[x]]<root->val&&mi[r[x]]>root->val;
//         if(b[x])ans=max(ans,s[x]);
//         return x;
//     }
// public:
//     int maxSumBST(TreeNode* root) {
//         b[0]=1;
//         ma[0]=-40000;
//         mi[0]=40000;
//         n=ans=s[0]=0;
//         work(root);
//         return ans;
//     }
// };

 函数变量命名相同造成问题,在复写程序时,要注意变量的选取

 

posted on 2020-03-11 07:38  黑暗尽头的超音速炬火  阅读(110)  评论(0编辑  收藏  举报