PAT1135 Red And Black Tree
原题链接:PAT1135
解析:以前只是听说过红黑树,但是这次是第一次接触红黑树,如果考试时出现这种没看过的数据结构,挺麻烦的。判断一个二叉树是否为红黑树有三个条件:
- 根节点是否为黑色
- 红色节点的子节点是否为黑色
- 每条路径上的黑色节点数量是否相同
错误报告:主要是建树方面出了问题,我写的其他地方思路以及形式都和题解一样,只是我想用数组存树,带来了很多麻烦,最终也导致几个点一直过不去,改用指针之后就过了。
代码实例:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
struct Node{
int val;
Node *ls,*rs;
};
Node *BuildTree(Node *root,int val){
if(root == NULL){
root = new Node();
root->val = val;
root->ls = NULL;
root->rs = NULL;
return root;
}
if(abs(val) <= abs(root->val))
root->ls = BuildTree(root->ls,val);
else
root->rs = BuildTree(root->rs,val);
return root;
}
int getcolor(Node* root){
return root->val;
}
bool judge1(Node *root){
if(root == NULL) return true;
if(root->val < 0){
if(root->ls != NULL && getcolor(root->ls) < 0) return false;
if(root->rs != NULL && getcolor(root->rs) < 0) return false;
}
return judge1(root->ls) && judge1(root->rs);
}
int getnum(Node *root){
if(root == NULL) return 0;
int l = getnum(root->ls);
int r = getnum(root->rs);
return root->val > 0 ? max(l,r)+1:max(l,r);
}
bool judge2(Node *root){
if(root == NULL) return true;
if(getnum(root->ls) == getnum(root->rs))
return judge2(root->ls) && judge2(root->rs);
else return false;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,val;
Node *root = NULL;
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&val);
root = BuildTree(root,val);
}
bool flag = true;
if(root->val < 0) flag = false;
if(flag && !judge1(root)) flag = false;
if(flag && !judge2(root)) flag = false;
if(flag) puts("Yes");
else puts("No");
}
return 0;
}