二叉搜索树判定
class Solution {
public:
struct node{int v[4];};
int ans=0;
node dfs(TreeNode* &root){
TreeNode* L=root->left;
TreeNode* R=root->right;
if(L==NULL||R==NULL){
if(L&&!R){
node V=dfs(L);
if(root->val>V.v[0]&&V.v[3]){
ans=max(ans,V.v[2]);
ans=max(ans,V.v[2]+root->val);
return {max(V.v[0],root->val),min(V.v[1],root->val),V.v[2]+root->val,1};
}
return {max(V.v[0],root->val),min(V.v[1],root->val),V.v[2]+root->val,0};
}else if(!L&&R){
node V=dfs(R);
if(root->val<V.v[1]&&V.v[3]){
ans=max(ans,V.v[2]);
ans=max(ans,V.v[2]+root->val);
return {max(V.v[0],root->val),min(V.v[1],root->val),V.v[2]+root->val,1};
}
return {max(V.v[0],root->val),min(V.v[1],root->val),V.v[2]+root->val,0};
}else{
ans=max(ans,root->val);
return {root->val,root->val,root->val,1};
}
}
node Lsum=dfs(L);
node Rsum=dfs(R);
if(root->val>Lsum.v[0]&&root->val<Rsum.v[1]&&Lsum.v[3]&&Rsum.v[3]){
ans=max(ans,Lsum.v[2]+Rsum.v[2]+root->val);
return {max(max(Lsum.v[0],Rsum.v[0]),root->val),min(min(Lsum.v[1],Rsum.v[1]),root->val),Lsum.v[2]+Rsum.v[2]+root->val,1};
}
return {max(max(Lsum.v[0],Rsum.v[0]),root->val),min(min(Lsum.v[1],Rsum.v[1]),root->val),Lsum.v[2]+Rsum.v[2]+root->val,0};
}
int maxSumBST(TreeNode* root) {
if(root==NULL)return 0;
dfs(root);
return ans;
}
};
京公网安备 11010502036488号