回答編集履歴
1
コード追記
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
|
+
```
|