PAT (Advanced Level) 1135 Is It A Red-Black Tree

Posted vividbingo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PAT (Advanced Level) 1135 Is It A Red-Black Tree相关的知识,希望对你有一定的参考价值。

题解

  题不难,记录一下红黑树特征。

    ?? 每个结点是黑色或者红色。

    ?? 根结点是黑色。

    ?? 每个叶子结点(NULL)是黑色。

    ?? 如果一个结点是红色的,则它的子结点必须是黑色的。

    ?? 每个结点到叶子结点所经过的黑色结点的个数相同。

代码

#include<bits/stdc++.h>
using namespace std;
struct node
{
   int w;
   struct node * left,*right;
};
int arr[35];
struct node * build(struct node * p, int w);
int judge_color(struct node * p);
int judge_cnt(struct node * p);
int getsum(struct node * p);
int main() 
{
   int k,n,i;
   struct node *Tree;
   scanf("%d",&k);
   while(k--)
   {
      Tree=NULL;
      scanf("%d",&n);
      for(i=0;i<n;i++)
      {
         scanf("%d",&arr[i]);
         Tree=build(Tree,arr[i]);
      }
      if(arr[0]<0 || judge_color(Tree) || judge_cnt(Tree)) printf("No
");
      else printf("Yes
");
   }
   system("pause");
   return 0;
}
struct node * build(struct node * p, int w)
{
   if(p==NULL)
   {
      p=new node();
      p->w=w;
      p->left=p->right=NULL;
   }
   else if(abs(w)<=abs(p->w)) p->left=build(p->left,w); 
   else p->right=build(p->right,w);
   return p;
}
int getsum(struct node * p)
{
   if(p==NULL) return 0;
   int l = getsum(p->left);
   int r = getsum(p->right);
   return p->w>0?max(l,r)+1:max(l,r);
}
int judge_color(struct node * p)
{
   if(p==NULL) return 0;
   if(p->w<0) 
   {
      if(p->left!=NULL && p->left->w <0) return 1;
      if(p->right!=NULL && p->right->w <0) return 1;
   }
   return judge_color(p->left) || judge_color(p->right);
}
int judge_cnt(struct node * p)
{
   if(p==NULL) return 0;
   if(getsum(p->left) != getsum(p->right)) return 1;
   return judge_cnt(p->left) || judge_cnt(p->right);
}

以上是关于PAT (Advanced Level) 1135 Is It A Red-Black Tree的主要内容,如果未能解决你的问题,请参考以下文章

PAT (Advanced Level) 1025. PAT Ranking (25)

PAT Advanced Level 1044

PAT Advanced Level 1043

PAT Advanced Level 1079

PAT Advanced Level 1095

PAT Advanced Level 1038