teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

補足を受けての追記

2019/01/04 05:06

投稿

otn
otn

スコア86349

answer CHANGED
@@ -1,2 +1,55 @@
1
1
  全ノードを、根から黒ノードの数を数えながら巡って、葉にたどり着いたら、黒接点の数を記録しておき、すでに記録した物と異なれば`0`を返して終了し、全部のノードを巡り終わったら`1`を返す。
2
- 再帰呼び出しで巡れば難しくない気がします。
2
+ 再帰呼び出しで巡れば難しくない気がします。
3
+
4
+ #追記
5
+ 黒の数には、根と葉も入れるとして、こんな感じでしょうか。
6
+ ```C
7
+ ##include <stdio.h>
8
+
9
+ typedef struct node { struct node *left, *right; int black; } NODE;
10
+
11
+ int count_save;
12
+
13
+ int check(NODE *this, int count);
14
+
15
+ int main(void){
16
+ NODE *root;
17
+ NODE x1, x2, x3, x4, x5, x6;
18
+
19
+ root = &x1;
20
+ x1 = (NODE){ &x2, &x3, 0 };
21
+ x2 = (NODE){ &x4, NULL, 1 };
22
+ x3 = (NODE){ &x5, &x6, 0 };
23
+ x4 = (NODE){ NULL, NULL, 0 };
24
+ x5 = (NODE){ NULL, NULL, 1 };
25
+ x6 = (NODE){ NULL, NULL, 1 };
26
+
27
+ count_save = -1;
28
+ printf("%d\n",check(root, 0));
29
+ }
30
+
31
+ int check(NODE *this, int count){
32
+ count += this->black;
33
+ if(!this->left && !this->right){ /* Leaf */
34
+ if(count_save==-1){
35
+ count_save = count;
36
+ return 1;
37
+ }else if(count_save != count){
38
+ return 0;
39
+ }else{
40
+ return 1;
41
+ }
42
+ }
43
+ if(this->left){
44
+ if(check(this->left,count)==0){
45
+ return 0;
46
+ }
47
+ }
48
+ if(this->right){
49
+ if(check(this->right,count)==0){
50
+ return 0;
51
+ }
52
+ }
53
+ return 1;
54
+ }
55
+ ```