解法:一次后序遍历即可
#include <stdio.h>
#include <math.h>
#include <algorithm>
#include <iostream>
#include <set>
#include <math.h>
#include <string.h>
#include <string>
#include <vector>
#define maxn 50010
using namespace std;
typedef struct Node
{
int data,level;
struct Node*left,*right;
}Node;
int cmp(int a,int b)
{
return abs(a)<abs(b);
}
Node* Create(int pre[],int mid[],int l1,int h1,int l2,int h2)
{
if(l1>h1)return NULL;
Node*root =new Node;
root->data=pre[l1];
int i;
for(i=l2;i<=h2&&mid[i]!=root->data;i++){}
int llen=i-l2;
root->left=Create(pre,mid,l1+1,l1+llen,l2,l2+llen-1);
root->right=Create(pre,mid,l1+llen+1,h1,i+1,h2);
return root;
}
int getHeight(Node* root)
{
if(root==NULL)return 1;
else return root->level;
}
void PostTraverse(Node* root,bool &flag)
{
if(root)
{
PostTraverse(root->left,flag);
PostTraverse(root->right,flag);
int lh=getHeight(root->left),rh=getHeight(root->right);
if(lh!=rh)//判断条件5
{
flag=false;
return;
}
else
{
root->level=max(lh,rh)+(root->data>0?1:0);
}
if(root->data<0)//如果是红色节点 判断条件四
{
if((root->left!=NULL&&root->left->data<0)||(root->right!=NULL&&root->right->data<0))//子节点为红色
{
flag=false;
}
}
}
}
int main()
{
// freopen("input.txt","r",stdin);
int m,n;
scanf("%d",&m);
while(m--)
{
scanf("%d",&n);
int pre[n],mid[n];
for(int i=0;i<n;i++)
{
scanf("%d",pre+i);
mid[i]=pre[i];
}
sort(mid,mid+n,cmp);
Node* root=Create(pre,mid,0,n-1,0,n-1);
bool flag=true;
if(root->data<0)flag=false;
else PostTraverse(root,flag);
if(flag)printf("Yes\n");
else printf("No\n");
}
}