没有AVL那么复杂,给一个红黑先序建个树。用链表建,通用。
#include<bits/stdc++.h>
using namespace std;
int n,m,f;
struct node{
int val;
node *l,*r;
};
node* inser(node *root,int val){
if(root==NULL){
root=new node();
root->val=val;
root->l=root->r=NULL;
}
else if(abs(val)<abs(root->val)){
root->l=inser(root->l,val);
}
else
root->r=inser(root->r,val);
return root;
}
int get_b(node *root){
if(root==NULL) return 0;
int l1=get_b(root->l);
int r1=get_b(root->r);
return root->val>0? max(l1,r1)+1:max(l1,r1);
}
int ju1(node *root){
if(root==NULL)
return 1;
if(root->val<0){
if((root->l && root->l->val<0)||(root->r && root->r->val<0))return 0;
}
return ju1(root->l) &&ju1(root->r);
}
int ju2(node *root){
if(root==NULL) return 1;
if(get_b(root->l)!=get_b(root->r)) return 0;
return ju2(root->l) &&ju2(root->r);
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>m;
node *root=NULL;
for(int j=0;j<m;j++){
int x;
cin>>x;
root=inser(root,x);
}
if(root->val<0||!ju1(root)||!ju2(root))
printf("No\n");
else
printf("Yes\n");
}
return 0;
}