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 

答えて

3

returnselfinorderへの呼び出しを終了し、self.rightChildを扱うことができます。 returnを削除すると、メソッドはとにかく何も返しません。

+0

ありがとうございました!それだった!基本条件の質問については、これらの再帰で本当に失われています。ルートは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

+0

質問:ノード8から、inorder()は10まですべてを戻す必要があることをどのように知っていますか?そして、いつすべてのノードが訪問されたのかを知るでしょうか? – Batool

+0

"ノード '5'はself.leftChild.inorder()を呼び出します。いいえ、' self.leftChild'はそれを試しても意味がありません。そして、もし自己が無意味であれば、それを取り除いてください。あなたの質問に:再帰は魔法ではなく、単なる関数呼び出しです。 1つの関数呼び出しが終了すると、それを呼び出した関数は途中で中断したところで処理を続けます。 Pythonは、スタック内のフレーム内のすべての関数呼び出しを追跡します。私はデバッガをステップ実行することをお勧めします。 [ここには単純なものがあります](http://www.pythontutor.com/)。あなたが見ていない、またはすでに慣れていないことをする方法を知らない。あなたが言ったことをやっているだけです。 –

関連する問題