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

回答編集履歴

1

コード追記

2020/08/23 09:18

投稿

yudedako67
yudedako67

スコア2052

answer CHANGED
@@ -9,4 +9,58 @@
9
9
  ```
10
10
  いろいろ試行錯誤で変えてみたようですが、これだけでいいです。
11
11
 
12
- あとは、ルートが削除された場合や、削除するノードの左側の子が右側の子を持たない場合といったコーナーケースの処理が抜け落ちてるのでそれも必要でしょう。
12
+ あとは、ルートが削除された場合や、削除するノードの左側の子が右側の子を持たない場合といったコーナーケースの処理が抜け落ちてるのでそれも必要でしょう。
13
+
14
+ ---
15
+
16
+ > 削除するノードの子の右、左があるかないかで条件分岐し、ある場合はそのままの処理でない場合は、削除するノードの親をNoneにする?という処理でしょうか?
17
+ > いまいち理解できていません。
18
+
19
+ 今のコードは不必要に分岐が深くコードが分散してるので、そこがこんがらがる最大の要因じゃないかと思います。
20
+ コードがまとまるように書くと下のような感じです。削除するノードの孫世代を見る条件の追加と、flag変数を使わずprevとの比較でルートにするか左右の子にするかを決定するようにした以外は大きくは変えていません。今のコードが分散しすぎて見通しが悪くなってることがわかると思います。
21
+ ```Python
22
+ def delete(self, search_num):
23
+ prev = None
24
+ current = self.head
25
+ #ノードを探索
26
+ while current is not None:
27
+ data = current.num
28
+ if search_num < data:
29
+ prev = current
30
+ current = current.left
31
+ elif data < search_num:
32
+ prev = current
33
+ current = current.right
34
+ else:
35
+ break
36
+
37
+ #見つからなかったらリターン
38
+ if current is None:
39
+ print(' There is no Player.')
40
+ return ValueError
41
+
42
+ #削除するノードの代わりになるノードを設定
43
+ newNode = None
44
+ if current.right is None:
45
+ newNode = current.left
46
+ elif current.left is None:
47
+ newNode = current.right
48
+ elif current.left.right is None: #追加した条件
49
+ newNode = current.left
50
+ newNode.right = current.right
51
+ else:
52
+ newNode = self.deletemin(current)
53
+ print("min = %d" %newNode.num)
54
+ newNode.right = current.right
55
+ newNode.left = current.left
56
+
57
+ #新しいノードを適切な位置に挿入
58
+ #flagをなくし、prevの値との比較で挿入する場所を決定
59
+ if prev is None:
60
+ self.head = newNode
61
+ elif search_num < prev.num:
62
+ prev.left = newNode
63
+ else:
64
+ prev.right = newNode
65
+ return True
66
+ ```