A1135 Is It A Red-Black Tree (30 point(s))

红黑树判断

1. 原文

There is a kind of balanced binary search tree named red-black tree in the data structure. It has the following 5 properties:

  • (1) Every node is either red or black.
  • (2) The root is black.
  • (3) Every leaf (NULL) is black.
  • (4) If a node is red, then both its children are black.
  • (5) For each node, all simple paths from the node to descendant leaves contain the same number of black nodes.

For example, the tree in Figure 1 is a red-black tree, while the ones in Figure 2 and 3 are not.

rbf1.jpg rbf2.jpg rbf3.jpg
Figure 1 Figure 2 Figure 3

For each given binary search tree, you are supposed to tell if it is a legal red-black tree.

Input Specification:

Each input file contains several test cases. The first line gives a positive integer K (≤30) which is the total number of cases. For each case, the first line gives a positive integer N (≤30), the total number of nodes in the binary tree. The second line gives the preorder traversal sequence of the tree. While all the keys in a tree are positive integers, we use negative signs to represent red nodes. All the numbers in a line are separated by a space. The sample input cases correspond to the trees shown in Figure 1, 2 and 3.

output Specification:

For each test case, print in a line “Yes” if the given tree is a red-black tree, or “No” if not.

Sample Input:

1
2
3
4
5
6
7
3
9
7 -2 1 5 -4 -11 8 14 -15
9
11 -2 1 -7 5 -4 8 14 -15
8
10 -7 5 -6 8 15 -11 17

Sample output:

1
2
3
Yes
No
No

2. 解析

  • 建树

    create(int x, node* &root)

  • 根为红,左右结点为黑

    if(root->data<0). if(root->lchild->data<0) if(root->rchild->data<0)

  • 左右黑结点数相同

  • 根为黑>0

3. AC代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#include<cstdio>
#include<algorithm>
using namespace std;
struct node{
int data;
node *lchild,*rchild;
};
node* newNode(int x){
node* root=new node;
root->data=x;
root->lchild=root->rchild=NULL;
return root;
}
void create(int x,node* &root){
if (root==NULL)
{
root=newNode(x);
return;
}else if (abs(root->data)>abs(x)){
create(x,root->lchild);
}else{
create(x,root->rchild);
}
}
bool rRedcBlack(node* root){
if (root==NULL)
{
return true;
}
if (root->data<0)
{
if (root->lchild!=NULL&&root->lchild->data<0)
{
return false;
}
if (root->rchild!=NULL&&root->rchild->data<0)
{
return false;
}
}
return rRedcBlack(root->lchild)&&rRedcBlack(root->rchild);
}
int blackNum(node* root)
{
if (root==NULL)
{
return 0;
}
int leftBlack=blackNum(root->lchild);
int rightBlack=blackNum(root->rchild);
return root->data>0?max(leftBlack,rightBlack)+1:max(leftBlack,rightBlack);
}
bool equalBlack(node* root){
if (root==NULL)
{
return true;
}
int l=blackNum(root->lchild);
int r=blackNum(root->rchild);
if (l!=r)
{
return false;
}
return equalBlack(root->lchild)&&equalBlack(root->rchild);

}
int main()
{
int k;
scanf("%d",&k);
while(k--){
int n;
scanf("%d",&n);
node* root=NULL;
int a;
for (int i = 0; i < n; ++i)
{
scanf("%d",&a);
create(a,root);
}
if (rRedcBlack(root)&&equalBlack(root)&&root->data>0)
{
printf("Yes\n");
}else{
printf("No\n");
}
}
return 0;
}

建树时,判断为abs(root->data)>abs(x)

本文结束  感谢您的阅读
  • 本文作者: Wang Ting
  • 本文链接: /zh-CN/2019/09/02/A1135/
  • 发布时间: 2019-09-02 21:44
  • 更新时间: 2021-10-29 14:10
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!