我正在尝试在二叉树上执行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)语句中,但这似乎没有任何帮助。返回语句在发生器内部也不好,这对我来说很有意义。谢谢!
答案 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
我还注意到你的深度优先搜索算法有正确的想法,但你实际上还没有搜索任何东西。我猜你已经知道了这一点。