PAT-A 1135
输入数据判断是否为一棵红黑树,
数据为正表示节点颜色为红,负为黑。
一个小结论——一颗二叉搜索树的前序遍历顺序即是他的节点插入顺序(虽然很显然
所以只需要建好树遍历判断即可
判断依据:
1.根节点为黑色(首先判断一下就行)。
2.每个红节点的儿子都是黑的。
3.从根节点到每一个叶子经过的黑节点个数相同。
通过DFS遍历一遍树即可得到结果。
#include<bits/stdc++.h>
using namespace std;
int n;
struct h{
int data;
h *l;
h *r;
};
h *root;
bool f;
int sum;
h *init(int data){
h *p=(h *)malloc(sizeof(h));
p->data=data;
p->l=NULL;
p->r=NULL;
return p;
}
h *in(h *p,int data){
if(p==NULL){
return init(data);
}
if((abs(data)<abs(p->data)))
p->l=in(p->l,data);
else if((abs(data)>abs(p->data)))
p->r=in(p->r,data);
return p;
}
h *Del(h *p){
if(p==NULL)
return NULL;
p->l=Del(p->l);
p->r=Del(p->r);
if(p->l==NULL&&p->r==NULL){
free(p);
p=NULL;
}
return p;
}
void dfs(h *p,int num){
if(p==NULL){
if(sum==0)
sum=num;
else{
if(sum!=num)
f=1;
}
return;
}
if(p->data<0&&p->l!=NULL&&p->l->data<0)
f=1;
if(p->data<0&&p->r!=NULL&&p->r->data<0)
f=1;
dfs(p->l,num+(p->data>0));
dfs(p->r,num+(p->data>0));
}
bool is(){
if(root->data<0)
return false;
sum=0;
f=0;
dfs(root,0);
if(f)
return false;
else
return true;
}
void print(h *p){
if(p==NULL)
return ;
print(p->l);
cout<<p->data<<endl;
print(p->r);
}
int main(){
int t;
cin>>t;
while(t--){
root=NULL;
cin>>n;
for(int i=0;i<n;i++){
int x;
cin>>x;
root=in(root,x);
//print(root);
//cout<<"-------"<<endl;
}
if(is())
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
root=Del(root);
}
return 0;
}