// /** // * 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; // } // };
函数变量命名相同造成问题,在复写程序时,要注意变量的选取
愿为天下目,萃聚六路华