PAT甲级1135
2017-09-24 16:02
169 查看
做出来了,但感觉心好痛。我发现我真是太懒惰了,以为简简单单记个模板,就万事大吉了。
没想到自己的思维被模板固化,就不会根据实际情况作出相应的改变了。模板当然要记忆,
但不可偷懒而导致思维僵化。引以为戒
dfs为判断过程,是在求树高的基础上,增加一个参数,判断是否存在前一个为红色节点并且当前节点是红色的情况
回溯判断当前节点的左右子树的黑高是否相等
#include<cstdio>
#include<algorithm>
#include<cmath>
//#define debug
using namespace std;
const int maxn=40;
struct node{
int data;
int lc;
int rc;
node(){
data=0;
lc=rc=-1;
}
};
bool cmp(int a,int b)
{
return abs(a)<abs(b);
}
int n;
int ptr=0;
node Tree[maxn];
int pre[maxn];
int in[maxn];
void create(int &root,int preL,int preR,int inL,int inR)
{
if(preL>preR)return;
if(preL>=n)return;
int roote=pre[preL];
root=ptr++;
Tree[root].data=roote;
int u=0;
for(u=inL;u<=inR;u++){
if(in[u]==roote)break;
}
int numLeft=u-inL;
create(Tree[root].lc,preL+1,preL+numLeft,inL,u-1);
create(Tree[root].rc,preL+numLeft+1,preR,u+1,inR);
}
bool IsRBt=true;
int dfs(int root,int pren)
{
if(IsRBt==false)return -1;
if(root==-1)return 1;
if(pren<0&&Tree[root].data<0){
IsRBt=false;
return -1;
}
int lh=dfs(Tree[root].lc,Tree[root].data);
int rh=dfs(Tree[root].rc,Tree[root].data);
if(rh!=lh){
IsRBt=false;
return -1;
}
return Tree[root].data>0?max(lh,rh)+1:max(lh,rh);
}
int main()
{
#ifdef debug
freopen("in.txt","r",stdin);
#endif
int t;
node s;
scanf("%d",&t);
for(int i=0;i<t;i++){
scanf("%d",&n);
fill(Tree,Tree+maxn,s);
ptr=0;
IsRBt=true;
for(int i=0;i<n;i++){
scanf("%d",&pre[i]);
in[i]=pre[i];
}
sort(in,in+n,cmp);
int root;
create(root,0,n-1,0,n-1);
if(Tree[root].data<0)IsRBt=false;
else
dfs(root,Tree[root].data);
if(IsRBt)printf("Yes\n");
else printf("No\n");
}
#ifdef debug
getchar();
#endif
}
没想到自己的思维被模板固化,就不会根据实际情况作出相应的改变了。模板当然要记忆,
但不可偷懒而导致思维僵化。引以为戒
dfs为判断过程,是在求树高的基础上,增加一个参数,判断是否存在前一个为红色节点并且当前节点是红色的情况
回溯判断当前节点的左右子树的黑高是否相等
#include<cstdio>
#include<algorithm>
#include<cmath>
//#define debug
using namespace std;
const int maxn=40;
struct node{
int data;
int lc;
int rc;
node(){
data=0;
lc=rc=-1;
}
};
bool cmp(int a,int b)
{
return abs(a)<abs(b);
}
int n;
int ptr=0;
node Tree[maxn];
int pre[maxn];
int in[maxn];
void create(int &root,int preL,int preR,int inL,int inR)
{
if(preL>preR)return;
if(preL>=n)return;
int roote=pre[preL];
root=ptr++;
Tree[root].data=roote;
int u=0;
for(u=inL;u<=inR;u++){
if(in[u]==roote)break;
}
int numLeft=u-inL;
create(Tree[root].lc,preL+1,preL+numLeft,inL,u-1);
create(Tree[root].rc,preL+numLeft+1,preR,u+1,inR);
}
bool IsRBt=true;
int dfs(int root,int pren)
{
if(IsRBt==false)return -1;
if(root==-1)return 1;
if(pren<0&&Tree[root].data<0){
IsRBt=false;
return -1;
}
int lh=dfs(Tree[root].lc,Tree[root].data);
int rh=dfs(Tree[root].rc,Tree[root].data);
if(rh!=lh){
IsRBt=false;
return -1;
}
return Tree[root].data>0?max(lh,rh)+1:max(lh,rh);
}
int main()
{
#ifdef debug
freopen("in.txt","r",stdin);
#endif
int t;
node s;
scanf("%d",&t);
for(int i=0;i<t;i++){
scanf("%d",&n);
fill(Tree,Tree+maxn,s);
ptr=0;
IsRBt=true;
for(int i=0;i<n;i++){
scanf("%d",&pre[i]);
in[i]=pre[i];
}
sort(in,in+n,cmp);
int root;
create(root,0,n-1,0,n-1);
if(Tree[root].data<0)IsRBt=false;
else
dfs(root,Tree[root].data);
if(IsRBt)printf("Yes\n");
else printf("No\n");
}
#ifdef debug
getchar();
#endif
}
相关文章推荐
- PAT甲级-1135 Is It A Red-Black Tree
- PAT甲级 1135 - Is It A Red-Black Tree
- PAT 甲级 1135 Is It A Red-Black Tree
- PAT甲级 1135.Is It A Red-Black Tree (30)
- 1135. Is It A Red-Black Tree (30)-PAT甲级真题
- PAT甲级1135----红黑树题解
- PAT甲级 1135. Is It A Red-Black Tree (30) 建树+深搜
- PAT甲级1135 Is It A Red-Black Tree
- PAT 1129. Recommendation System (25) 甲级
- PAT - 甲级 - 1091. Acute Stroke (30)(三维BFS)
- PAT 甲级1137. Final Grading (25)
- PAT 甲级 1019 General Palindromic Number(简单题)
- PAT 甲级 1026 Table Tennis(模拟)
- PAT甲级1001. A+B Format (20)解题报告
- pat 甲级 1126. Eulerian Path java实现
- 1049. 数列的片段和(20) PAT乙级 &1104. Sum of Number Segments (20)PAT甲级
- PAT甲级1004
- PAT - 甲级 - 1007. Maximum Subsequence Sum (25)
- PAT(甲级)1012. The Best Rank (25)
- PAT甲级1002. A+B for Polynomials (25)