您的位置:首页 > 其它

PAT 甲级 1135 Is It A Red-Black Tree

2018-02-22 20:17 399 查看
题目链接:点击打开链接
题意:给出一棵二叉搜索树,判断是否为红黑树(一种二叉平衡搜索树)。
思路:其实很简单,利用给出的前序遍历的顺序插入节点,可以直接建造出对应的二叉搜索树,再根据红黑树的特征去判断是否为红黑树。#include <cstdio>
#include <cstring>
#include <cmath>
#include <iostream>
using namespace std;
int data[50],le[50],rig[50];
int root,len;
void Insert(int &ro,int loc){//先建二叉搜索树(按照先序遍历的顺序插入节点即可)
if(ro == -1){
ro = loc;
return;
}
fabs(data[loc]) < fabs(data[ro])?Insert(le[ro],loc):Insert(rig[ro],loc);
return;
}
bool Judge(int ro,int cnt){//判断是否为red-black tree,相当于遍历整棵树
if(ro == -1){//到达leaf,判断当前路径上black node的个数是否与之前的相同
if(len == -1){
len = cnt;
return true;
}
return cnt == len;
}
if(data[ro] < 0){//到达red node,判断两个儿子节点是否为black node
if(le[ro] != -1 && data[le[ro]] < 0) return false;
if(rig[ro] != -1 && data[rig[ro]] < 0) return false;
}
//递归判断左右子树
return Judge(le[ro],cnt + (data[ro] > 0)) && Judge(rig[ro],cnt + (data[ro] > 0));
}
int main(){
int t,n;
bool flag;
scanf("%d",&t);
while(t--){
root = -1;len = -1;
memset(le,-1,sizeof(le));
memset(rig,-1,sizeof(rig));
scanf("%d",&n);
for(int i = 0;i < n;i++){
scanf("%d",&data[i]);
Insert(root,i);
}
flag = Judge(root,0);
if(data[root] < 0) flag = false;//判断root是否是black node
puts(flag?"Yes":"No");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: