回答編集履歴

2

追記しました

2020/12/02 03:30

投稿

tatsu99
tatsu99

スコア5493

test CHANGED
@@ -125,3 +125,119 @@
125
125
 
126
126
 
127
127
  ```
128
+
129
+
130
+
131
+ こちらで実行した結果です。
132
+
133
+ 30を追加
134
+
135
+ 20を追加
136
+
137
+ 行きがけ順で表示
138
+
139
+ 20を削除・・・ここで応答なしになるため、Ctrl+Cで強制終了
140
+
141
+ 削除の処理で無限ループしていると思われます。
142
+
143
+
144
+
145
+ D:\goo\c>goo1_1
146
+
147
+ 二分探索木をします
148
+
149
+ メニューを選んでください
150
+
151
+
152
+
153
+ 1=追加
154
+
155
+ 2=行きがけ順
156
+
157
+ 3=通りがけ順
158
+
159
+ 4=帰りがけ順
160
+
161
+ 5=指定した値の番地
162
+
163
+ 6=削除
164
+
165
+ 9=終了
166
+
167
+ 1
168
+
169
+ 追加する数字を入力してください
170
+
171
+ 30
172
+
173
+ メニューを選んでください
174
+
175
+
176
+
177
+ 1=追加
178
+
179
+ 2=行きがけ順
180
+
181
+ 3=通りがけ順
182
+
183
+ 4=帰りがけ順
184
+
185
+ 5=指定した値の番地
186
+
187
+ 6=削除
188
+
189
+ 9=終了
190
+
191
+ 1
192
+
193
+ 追加する数字を入力してください
194
+
195
+ 20
196
+
197
+ メニューを選んでください
198
+
199
+
200
+
201
+ 1=追加
202
+
203
+ 2=行きがけ順
204
+
205
+ 3=通りがけ順
206
+
207
+ 4=帰りがけ順
208
+
209
+ 5=指定した値の番地
210
+
211
+ 6=削除
212
+
213
+ 9=終了
214
+
215
+ 2
216
+
217
+ 行きがけ順です
218
+
219
+ 3020メニューを選んでください
220
+
221
+
222
+
223
+ 1=追加
224
+
225
+ 2=行きがけ順
226
+
227
+ 3=通りがけ順
228
+
229
+ 4=帰りがけ順
230
+
231
+ 5=指定した値の番地
232
+
233
+ 6=削除
234
+
235
+ 9=終了
236
+
237
+ 6
238
+
239
+ 指定した値を削除します
240
+
241
+ 20
242
+
243
+ ^C

1

追記しました。

2020/12/02 03:30

投稿

tatsu99
tatsu99

スコア5493

test CHANGED
@@ -9,3 +9,119 @@
9
9
  添付図の黄色の部分です。
10
10
 
11
11
  ![イメージ説明](f1f37edb27c1b6490a162b10ae520c63.png)
12
+
13
+
14
+
15
+ int deleteのみ整形しました。
16
+
17
+ if (x->left == NULL) { //ここからif文の書き方変えました
18
+
19
+ の個所ですが、少し上の行で
20
+
21
+ if (x->left == NULL && x->right == NULL) {
22
+
23
+ の判断をしているので、
24
+
25
+ if (x->left == NULL) { は必ず成立します。
26
+
27
+ 以前のより悪くなっているような気がします。
28
+
29
+ インデントをきちんとすれば、わかりやすいかと。
30
+
31
+ ```C
32
+
33
+ int delete(int key)
34
+
35
+ {
36
+
37
+ /* 親へのポインタを使う */
38
+
39
+ NODE **p, *x;
40
+
41
+ /* 変数pが変数rootを指すように初期化する */
42
+
43
+ p = &root;
44
+
45
+ /* 削除対象となる要素を探す */
46
+
47
+ while (*p != NULL) {
48
+
49
+ /* 見つかった
50
+
51
+ 変数pは削除される節の親のメンバleft,right
52
+
53
+ 変数xは削除される節そのものを指している */
54
+
55
+ if (key == (*p)->data) {
56
+
57
+ x = *p;
58
+
59
+ /* 1つも子を持っていない、葉である場合 */
60
+
61
+ if (x->left == NULL && x->right == NULL) {
62
+
63
+ *p = NULL;
64
+
65
+ /* 右の子のみをもつ */
66
+
67
+ if (x->left == NULL) { //ここからif文の書き方変えました
68
+
69
+ *p = x->right;
70
+
71
+ /* 左の子のみをもつ */
72
+
73
+ } else if (x->right == NULL) {
74
+
75
+ *p = x->left;
76
+
77
+ /* 左右2つの子を持つ */
78
+
79
+ } else {
80
+
81
+ /* 部分木から最小の要素を取り去る */
82
+
83
+ *p = deletemin(&x->right);
84
+
85
+ (*p)->right = x->right;
86
+
87
+ (*p)->left = x->left;
88
+
89
+ }
90
+
91
+ /* 取り除いた節を解放させる */
92
+
93
+ free(x);
94
+
95
+ printf("Done\n");
96
+
97
+ return 1;
98
+
99
+
100
+
101
+ } else if (key < (*p)->data)
102
+
103
+ /* 左部分木に進む */
104
+
105
+ p = &(*p)->left;
106
+
107
+ else
108
+
109
+ /* 右部分木に進む */
110
+
111
+ p = &(*p)->right;
112
+
113
+ }
114
+
115
+ }
116
+
117
+ /* 削除対象が見つからなかった */
118
+
119
+ printf("NotExist\n");
120
+
121
+ return 0;
122
+
123
+ }
124
+
125
+
126
+
127
+ ```