Python - 使用生成器深度迭代树 - 第一顺序

时间:2012-12-26 16:32:14

标签: python recursion generator yield depth-first-search

我正在尝试在二叉树上执行DFS。树是有效的。当使用打印替换yield(当它不是生成器)时,函数本身就可以工作。

class BinaryTree(object):
 def __init__(self, root):
    self.root = root

 def dfs(self):
    print "Depth First"
    return self.depth(self.root)

 def depth(self, Node):
    print "Starts"
    yield Node
    if Node.left != None:
        print "keep it up left" 
        self.depth(Node.left)
    if Node.right != None:
        print "keep it up right"    
        self.depth(Node.right)
    print "oh no"

编辑:主要摘录:

tree = BinaryTree(15) #adds the key 15 as the root
tree.addKey(10)       #adds additional entries
...
tree.addKey(5)
depthFirstSearch = tree.dfs()
for i in range(8): 
    print depthFirstSearch.next()
    print "outside of fnc"

为完整起见,树看起来像这样:

{15: {10: {3: {2: , }, {5: , }}, }, {17: , {60: {23: , }, }}}

输出如下:

Depth First
Starts 
15
outside of fnc
keep it up left
keep it up right
oh no

很明显,由于'保持'调试线,节点就在那里。但它似乎跳过了递归步骤。否则它将再次打印开始。我已经尝试将self添加到self.depth(Node.right)语句中,但这似乎没有任何帮助。返回语句在发生器内部也不好,这对我来说很有意义。谢谢!

1 个答案:

答案 0 :(得分:0)

BinaryTree.depth内,您正在递归,但您没有对递归调用做任何事情。

例如:

self.depth(Node.left)

应该是

for node in self.depth(Node.left):
    yield node

在Python 3.3+中,它可以像

一样简单
yield from self.depth(Node.left)

你的“主”中的for循环应该是这样的:

for node in depthFirstSearch:
    print node

我还注意到你的深度优先搜索算法有正确的想法,但你实际上还没有搜索任何东西。我猜你已经知道了这一点。