質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

Q&A

解決済

1回答

2046閲覧

二分木の削除機能 in Python

退会済みユーザー

退会済みユーザー

総合スコア0

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

アルゴリズム

アルゴリズムとは、定められた目的を達成するために、プログラムの理論的な動作を定義するものです。

0グッド

0クリップ

投稿2018/06/02 07:33

二分木の削除機能の実装

二分木をPythonで自作しているのですが、削除のところで詰まってしまいました。
削除を実装できたのですが、動かないです。

追加や検索は動いているので、何に問題があるのかわからず困っています。どなたか私のコードを改変して、削除機能を動かせる方はいないでしょうか。。。?

発生している問題・エラーメッセージ

# [50, 98, 54, 6, 34, 66, 63, 52, 39, 62] # 6 # 34 # 39 # 50 # 52 # 54 # 62 # 63 # 66 # 98 # True # 6 # 34 # 39 # 50 # 52 # 54 # 62 # 63 # 66 # 98

該当のソースコード

python:Binary_Tree

1class Node: 2 def __init__(self, val): 3 self.l = None 4 self.r = None 5 self.v = val 6 7 8class Tree: 9 def __init__(self): 10 self.root = None 11 12 def add_list(self, l): 13 for i in l: 14 self.add(i) 15 16 def add(self, val): 17 if (self.root == None): 18 self.root = Node(val) 19 else: 20 self._add(val, self.root) 21 22 def _add(self, val, node): # Private Function 23 if val == node.v: 24 print("Already existed in tree!") 25 if (val < node.v): 26 if (node.l == None): 27 node.l = Node(val) 28 else: 29 self._add(val, node.l) 30 else: 31 if (node.r == None): 32 node.r = Node(val) 33 else: 34 self._add(val, node.r) 35 36 37 def find(self, val): 38 if self.root != None: 39 return self._find(val, self.root) 40 else: 41 return False 42 43 44 def _find(self, val, node): 45 if node == None: 46 return False 47 if val == node.v: 48 return True 49 elif val > node.v: 50 return self._find(val, node.r) 51 elif val < node.v: 52 return self._find(val, node.l) 53 54 def printtree(self): 55 if self.root == None: 56 print("Tree doesn't exist yet!") 57 else: 58 self._printtree(self.root) 59 60 def _printtree(self, node): 61 try: 62 self._printtree(node.l) 63 print(str(node.v)) 64 self._printtree(node.r) 65 except: 66 return None 67 68 def delete(self, val): 69 if self.root == None: 70 print("Tree doesn't exist!") 71 else: 72 self._delete(val, self.root) 73 74# はじめに探索して対象のノードを探す。 その後、子の有無によって処理を分ける。 75# 76# 1 子がない場合 ~~ 対象のノードは葉であるので、node.v == NoneでOK 77# 2 一つの子がある場合 ~~ node = 存在する方の子(node.r or node.l)にすればOK 78# 3 どちらの子もある場合 ~~ 右の子から最小の値(node.min)を探し、node.v = node._findMinとする。のちに、 79# 最小の値を持つnode_minをnode_min = node.rとすればOK. 80# 81# はじめに_findMin関数をつくる. 82 83 def _findMin(self, node): 84 if node.l == None: 85 return node.v 86 else: 87 return self._findMin(node.l) 88 89# 次に_deleteMin関数を作る. 90 91 def _deleteMin(self, node): 92 if node.l == None: 93 return node.r 94 else: 95 node.l = self._deleteMin(node.l) 96 return node 97 98 def _delete(self, val, node): 99 # 削除したい値が木に存在するとき 100 try: 101 if val == node.v: 102 # どちらの子もNone, または左の子がNoneの場合 103 if node.l == None: 104 node = node.r 105 # 右の子がNoneの場合 106 elif node.r == None: 107 node = node.l 108 # どちらの子も存在する場合 109 else: 110 node.v = self._findMin(node.r) 111 node.r = self._deleteMin(node.r) 112 elif val < node.v: 113 self._delete(val, node.l) 114 elif val > node.v: 115 self._delete(val, node.r) 116 # 削除したい値が木に存在しないとき 117 except: 118 print("Value doesn't exist in tree.") 119 120 121# Test 122# ________ 123 124 125import random 126 127if __name__ == "__main__": 128 tree = Tree() 129 130 random.seed(0) 131 l = [random.randint(1, 100) for x in range(10)] 132 133 print(l) 134 135 tree.add_list(l) 136 137 # for i in l: 138 # tree.add(i) 139 140 tree.printtree() 141 142 print(tree.find(50)) 143 144 145 146 tree.delete(39) 147 148 tree.printtree() 149

試したこと

ここを参考にしました。
Python二分木

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

python

1if node.l == None and node.r == None: 2 node.v = None 3elif node.l == None: #if->elif 4……

この修正では正しくないが、せめて値だけを消すことはできます。
親ノードの参照から、値を消すことが目的です。
もう一度参考リンクを読み直してみてください。

投稿2018/06/03 00:26

mkgrei

総合スコア8560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問