2017-03-10 17 views
1

BinaryTreeクラスで、ジグザグの方法でツリーをトラバースするメソッドを作成しました。再帰関数からジェネレータを作成する

def zigzag_traversal(self,l2r_flag=True,node=DEFAULT): 
    """ 
    traverse binary tree in zigzag manner 
    ALG: pass an additional boolean variable. if variable is true call left to right, 
      if variable is false call right to left 
    """ 
    if node == DEFAULT: 
     node = self.__root 
    if node is None: 
     return 
    if node is not None: 
     print node.getData() 
    if l2r_flag == True: 
     self.zigzag_traversal(False,node.getRight()) 
     self.zigzag_traversal(False,node.getLeft()) 
    else: 
     self.zigzag_traversal(True,node.getLeft()) 
     self.zigzag_traversal(True,node.getRight()) 

上記のコードは、論理的に正しいです。

データを出力する代わりに、これをジェネレータに変換してノードを生成しようとしています。そのため、他のいくつかの方法で他の方法を実行できるようになりました。

スタックオーバーフローに関する他の質問/回答を見て、以下のようにprintの代わりにyieldするようにコードを修正しました。

def zigzag_traversal(self,l2r_flag=True,node=DEFAULT): 
    """ 
    traverse binary tree in zigzag manner 
    ALG: pass an additional boolean variable. if variable is true call left to right, 
      if variable is false call right to left 
    """ 
    if node == DEFAULT: 
     node = self.__root 
    if node is None: 
     return 
    if node is not None: 
     yield node 
    if l2r_flag == True: 
     for node in self.zigzag_traversal(False,node.getRight()): 
      yield node 
     for node in self.zigzag_traversal(False,node.getLeft()): 
      yield node 
    else: 
     for node in self.zigzag_traversal(True,node.getLeft()): 
      yield node 
     for node in self.zigzag_traversal(True,node.getRight()): 
      yield node 

しかし、上記のコードは、単に私が彼らは論理的に同じことになっていると思っていても、ノード値を出力コードと同じ出力を与えるものではありません。私のメソッドをジェネレータに変換しようとする私の試みは間違っています。

私の質問は、ノードを正しく印刷するのではなく、元のコードを変換する方法です。

+0

出力はどのように異なりますか?いくつかのサンプル入出力を提供できますか? –

答えて

1

ここに問題があると思われます。繰り返し処理される変数の名前と、traversalの呼び出しで使用されているオブジェクトの両方としてnodeを使用しています。最初のループでnodeを覆い隠すと、2番目のループを入力するときに正しい値を持たなくなります。

反復変数に別の名前を使用してみてください。

for x in self.zigzag_traversal(False,node.getRight()): 
    yield x 
for x in self.zigzag_traversal(False,node.getLeft()): 
    yield x 

また、Pythonの3.Xにアップグレードし、あなたはそれを得るために新しい名前を作成する代わりにyield fromステートメントを使用することができます。

yield from self.zigzag_traversal(False,node.getRight()) 
yield from self.zigzag_traversal(False,node.getLeft()) 
+0

ああ!私は急いで、私は変数をシャドーイングしていたという事実を見落としました。ありがとう! – anu