前提・実現したいこと
pythonの探索木構造を勉強しています。指定された番号をもつデータの木を探索し、そのデータを消す関数を作成しています。木の浅い部分で削除され、小木に2つのデータを持つ場合、複雑な入れ替わりになると思うのですが、そこも実現しどの木でも削除されるようにしたいです。
発生している問題・エラーメッセージ
小木に2つのデータがある際にうまく削除されずに、小さいものを消した位置にもってこれるのですが、その小木が急に消えてしまい、よくわからなくなってしまいました。
該当のソースコード
python
1class TreeSearch: 2 def deletemin(self, curent): 3 prev = curent 4 tmp = curent.left 5 while tmp.right: 6 prev = tmp 7 tmp = tmp.right 8 prev.right = tmp.right 9 prev.left = tmp.left 10 return tmp 11 12 def delete(self, search_num): 13 curent = self.head 14 prev = self.head 15 flag = '' 16 if curent: 17 while True: 18 data = curent.num 19 if search_num < data: 20 if curent.left is None: 21 print(' There is no Player.') 22 return ValueError 23 prev = curent 24 curent = curent.left 25 flag = 'left' 26 elif search_num > data: 27 if not curent.right: 28 print(' There is no Player.') 29 return ValueError 30 prev = curent 31 curent = curent.right 32 flag = 'right' 33 elif search_num == data: 34 if curent.right == None and curent.left == None: 35 if flag == 'left': 36 prev.left = None 37 elif flag == 'right': 38 prev.right = None 39 elif curent.right == None: 40 if flag == 'left': 41 prev.left = curent.left 42 elif flag == 'right': 43 prev.right = curent.left 44 elif curent.left == None: 45 if flag == 'left': 46 prev.left = curent.right 47 elif flag == 'right': 48 prev.right = curent.right 49 else: 50 tmp = self.deletemin(curent) 51 print("min = %d" %tmp.num) 52 if flag == 'left': 53 prev.left = tmp 54 elif flag == 'right': 55 prev.right = tmp 56 tmp.right = curent.right 57 tmp.left = curent.left 58 return True 59 else: 60 print(' There is no Player.')
python
1if curent: # curent else 条件分岐内にroot削除処理を挿入 2 if self.head.num == search_num: 3 if self.head.right == None and self.head.left == None: 4 self.head = None 5 return True 6 elif self.head.right == None and self.head.left: 7 self.head = self.head.left 8 return True 9 elif self.head.right and self.head.left == None: 10 self.head = self.head.right 11 return True 12 else: 13 head_tmp = self.head 14 curent = self.head.right 15 prev = None 16 while curent.left: 17 prev = curent 18 curent = curent.left 19 self.head = curent 20 self.head.left = head_tmp.left 21 if curent.num < prev.num: 22 prev.left = self.head.right 23 else: 24 prev.right = self.head.right 25 self.head.right = prev 26 return True 27 else: 28 while True: 29 ・ 30 ・ 31 ・ 32 以下続き
試したこと
関数deleteminが間違っている気がして、いろいろ処理を追加したり、rightとleftの書き間違いかと、入れ替えたりしてみたのですが、上記のコードが一番まともに動作しています。
どなたかご教授ください。
補足情報(FW/ツールのバージョンなど)
python3.8