做出来了,但感觉心好痛。我发现我真是太懒惰了,以为简简单单记个模板,就万事大吉了。
没想到自己的思维被模板固化,就不会根据实际情况作出相应的改变了。模板当然要记忆,
但不可偷懒而导致思维僵化。引以为戒
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 "); else printf("No "); } #ifdef debug getchar(); #endif }