0
バイナリ検索ツリーで単純なインオーダートラバーサルメソッドを実装しようとしています。Pythonでインオーダートラバーサル(再帰)を使用してバイナリ検索ツリーノードを印刷する
10
/ \
5 15
\
8
私はツリー全体を印刷したいが、最初の3ノードしか印刷されない。私の質問は次のとおりです:
- 私の 'inorder'プリント方法を修正するにはどうしたらいいですか? 'insert'メソッドは正常に動作します。 - inorderメソッドの基本条件は何ですか?すべてのノードが印刷されたとき、どのように停止することがわかりますか? return self.leftChild.inorder()
で
class Tree:
def __init__(self, value):
self.node = value
self.leftChild = None
self.rightChild = None
def insert(self, value):
if self.node is None:
self.node = value
return True
if self.node is not value:
if self.node > value:
if self.leftChild is None:
self.leftChild = Tree(value)
else:
return self.leftChild.insert(value)
if self.node < value:
if self.rightChild is None:
self.rightChild = Tree(value)
else:
return self.rightChild.insert(value)
else:
return False
def inorder(self):
if self:
if self.leftChild:
return self.leftChild.inorder()
print self.node
if self.rightChild:
return self.rightChild.inorder()
tree = Tree(10)
tree.insert(5)
tree.insert(8)
tree.insert(15)
tree.inorder()
> 5
8
10
ありがとうございました!それだった!基本条件の質問については、これらの再帰で本当に失われています。ルートは10:10の左の子は5:10の右の子は15:5の右の子は8です。Inorder()はルートで始まり、自己を呼び出します。 leftChild.inorder()、これは '5'です。今ノード '5'はself.leftChild.inorder()をもう一度呼び出しますが、左の子がないので 'print self.node'を実行します。次に、8になるself.rightChild.inorder()を呼び出します.8には正しい子がないので、 'print self.node'を実行します。 – Batool
質問:ノード8から、inorder()は10まですべてを戻す必要があることをどのように知っていますか?そして、いつすべてのノードが訪問されたのかを知るでしょうか? – Batool
"ノード '5'はself.leftChild.inorder()を呼び出します。いいえ、' self.leftChild'はそれを試しても意味がありません。そして、もし自己が無意味であれば、それを取り除いてください。あなたの質問に:再帰は魔法ではなく、単なる関数呼び出しです。 1つの関数呼び出しが終了すると、それを呼び出した関数は途中で中断したところで処理を続けます。 Pythonは、スタック内のフレーム内のすべての関数呼び出しを追跡します。私はデバッガをステップ実行することをお勧めします。 [ここには単純なものがあります](http://www.pythontutor.com/)。あなたが見ていない、またはすでに慣れていないことをする方法を知らない。あなたが言ったことをやっているだけです。 –