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

回答編集履歴

2

追記しました

2020/12/02 03:30

投稿

tatsu99
tatsu99

スコア5540

answer CHANGED
@@ -61,4 +61,62 @@
61
61
  return 0;
62
62
  }
63
63
 
64
- ```
64
+ ```
65
+
66
+ こちらで実行した結果です。
67
+ 30を追加
68
+ 20を追加
69
+ 行きがけ順で表示
70
+ 20を削除・・・ここで応答なしになるため、Ctrl+Cで強制終了
71
+ 削除の処理で無限ループしていると思われます。
72
+
73
+ D:\goo\c>goo1_1
74
+ 二分探索木をします
75
+ メニューを選んでください
76
+
77
+ 1=追加
78
+ 2=行きがけ順
79
+ 3=通りがけ順
80
+ 4=帰りがけ順
81
+ 5=指定した値の番地
82
+ 6=削除
83
+ 9=終了
84
+ 1
85
+ 追加する数字を入力してください
86
+ 30
87
+ メニューを選んでください
88
+
89
+ 1=追加
90
+ 2=行きがけ順
91
+ 3=通りがけ順
92
+ 4=帰りがけ順
93
+ 5=指定した値の番地
94
+ 6=削除
95
+ 9=終了
96
+ 1
97
+ 追加する数字を入力してください
98
+ 20
99
+ メニューを選んでください
100
+
101
+ 1=追加
102
+ 2=行きがけ順
103
+ 3=通りがけ順
104
+ 4=帰りがけ順
105
+ 5=指定した値の番地
106
+ 6=削除
107
+ 9=終了
108
+ 2
109
+ 行きがけ順です
110
+ 3020メニューを選んでください
111
+
112
+ 1=追加
113
+ 2=行きがけ順
114
+ 3=通りがけ順
115
+ 4=帰りがけ順
116
+ 5=指定した値の番地
117
+ 6=削除
118
+ 9=終了
119
+ 6
120
+ 指定した値を削除します
121
+ 20
122
+ ^C

1

追記しました。

2020/12/02 03:30

投稿

tatsu99
tatsu99

スコア5540

answer CHANGED
@@ -3,4 +3,62 @@
3
3
  全角の空白が混じっています。あなたの環境ではエラーになりませんか。
4
4
  (コンパイラによっては全角空白も半角空白と同じ扱いをするのがあるかもしれませんが)
5
5
  添付図の黄色の部分です。
6
- ![イメージ説明](f1f37edb27c1b6490a162b10ae520c63.png)
6
+ ![イメージ説明](f1f37edb27c1b6490a162b10ae520c63.png)
7
+
8
+ int deleteのみ整形しました。
9
+ if (x->left == NULL) { //ここからif文の書き方変えました
10
+ の個所ですが、少し上の行で
11
+ if (x->left == NULL && x->right == NULL) {
12
+ の判断をしているので、
13
+ if (x->left == NULL) { は必ず成立します。
14
+ 以前のより悪くなっているような気がします。
15
+ インデントをきちんとすれば、わかりやすいかと。
16
+ ```C
17
+ int delete(int key)
18
+ {
19
+ /* 親へのポインタを使う */
20
+ NODE **p, *x;
21
+ /* 変数pが変数rootを指すように初期化する */
22
+ p = &root;
23
+ /* 削除対象となる要素を探す */
24
+ while (*p != NULL) {
25
+ /* 見つかった
26
+ 変数pは削除される節の親のメンバleft,right
27
+ 変数xは削除される節そのものを指している */
28
+ if (key == (*p)->data) {
29
+ x = *p;
30
+ /* 1つも子を持っていない、葉である場合 */
31
+ if (x->left == NULL && x->right == NULL) {
32
+ *p = NULL;
33
+ /* 右の子のみをもつ */
34
+ if (x->left == NULL) { //ここからif文の書き方変えました
35
+ *p = x->right;
36
+ /* 左の子のみをもつ */
37
+ } else if (x->right == NULL) {
38
+ *p = x->left;
39
+ /* 左右2つの子を持つ */
40
+ } else {
41
+ /* 部分木から最小の要素を取り去る */
42
+ *p = deletemin(&x->right);
43
+ (*p)->right = x->right;
44
+ (*p)->left = x->left;
45
+ }
46
+ /* 取り除いた節を解放させる */
47
+ free(x);
48
+ printf("Done\n");
49
+ return 1;
50
+
51
+ } else if (key < (*p)->data)
52
+ /* 左部分木に進む */
53
+ p = &(*p)->left;
54
+ else
55
+ /* 右部分木に進む */
56
+ p = &(*p)->right;
57
+ }
58
+ }
59
+ /* 削除対象が見つからなかった */
60
+ printf("NotExist\n");
61
+ return 0;
62
+ }
63
+
64
+ ```