回答編集履歴

1

コード追記

2020/08/23 09:18

投稿

yudedako67
yudedako67

スコア2047

test CHANGED
@@ -21,3 +21,111 @@
21
21
 
22
22
 
23
23
  あとは、ルートが削除された場合や、削除するノードの左側の子が右側の子を持たない場合といったコーナーケースの処理が抜け落ちてるのでそれも必要でしょう。
24
+
25
+
26
+
27
+ ---
28
+
29
+
30
+
31
+ > 削除するノードの子の右、左があるかないかで条件分岐し、ある場合はそのままの処理でない場合は、削除するノードの親をNoneにする?という処理でしょうか?
32
+
33
+ > いまいち理解できていません。
34
+
35
+
36
+
37
+ 今のコードは不必要に分岐が深くコードが分散してるので、そこがこんがらがる最大の要因じゃないかと思います。
38
+
39
+ コードがまとまるように書くと下のような感じです。削除するノードの孫世代を見る条件の追加と、flag変数を使わずprevとの比較でルートにするか左右の子にするかを決定するようにした以外は大きくは変えていません。今のコードが分散しすぎて見通しが悪くなってることがわかると思います。
40
+
41
+ ```Python
42
+
43
+ def delete(self, search_num):
44
+
45
+ prev = None
46
+
47
+ current = self.head
48
+
49
+ #ノードを探索
50
+
51
+ while current is not None:
52
+
53
+ data = current.num
54
+
55
+ if search_num < data:
56
+
57
+ prev = current
58
+
59
+ current = current.left
60
+
61
+ elif data < search_num:
62
+
63
+ prev = current
64
+
65
+ current = current.right
66
+
67
+ else:
68
+
69
+ break
70
+
71
+
72
+
73
+ #見つからなかったらリターン
74
+
75
+ if current is None:
76
+
77
+ print(' There is no Player.')
78
+
79
+ return ValueError
80
+
81
+
82
+
83
+ #削除するノードの代わりになるノードを設定
84
+
85
+ newNode = None
86
+
87
+ if current.right is None:
88
+
89
+ newNode = current.left
90
+
91
+ elif current.left is None:
92
+
93
+ newNode = current.right
94
+
95
+ elif current.left.right is None: #追加した条件
96
+
97
+ newNode = current.left
98
+
99
+ newNode.right = current.right
100
+
101
+ else:
102
+
103
+ newNode = self.deletemin(current)
104
+
105
+ print("min = %d" %newNode.num)
106
+
107
+ newNode.right = current.right
108
+
109
+ newNode.left = current.left
110
+
111
+
112
+
113
+ #新しいノードを適切な位置に挿入
114
+
115
+ #flagをなくし、prevの値との比較で挿入する場所を決定
116
+
117
+ if prev is None:
118
+
119
+ self.head = newNode
120
+
121
+ elif search_num < prev.num:
122
+
123
+ prev.left = newNode
124
+
125
+ else:
126
+
127
+ prev.right = newNode
128
+
129
+ return True
130
+
131
+ ```