我正在使用本书中描述的二叉树 problem solving with algorithms and data structures
class BinaryTree:
def __init__(self,rootObj):
self.key = rootObj
self.leftChild = None
self.rightChild = None
已经有一个前序遍历方法定义如下。
def preorder(tree):
if tree:
print(tree.self.key)
preorder(tree.getLeftChild())
preorder(tree.getRightChild())
我只想添加所访问节点列表的返回值。所以我可以做类似
的事情for i in preorder(tree):
etc...
我无法从递归方法返回列表。一旦它返回'返回'我就尝试使用
进行变换,递归就会停止return [tree.self.key] + preorder()
或者
yield ...
有什么想法吗?
答案 0 :(得分:5)
打印时,您确定要tree.self.key
而不是tree.key
吗?
否则,使用yield from
(Python 3.3 +)的解决方案:
def preorder(tree):
if tree:
yield tree
yield from preorder(tree.getLeftChild())
yield from preorder(tree.getRightChild())
或使用简单的yield
:
def preorder(tree):
if tree:
yield tree
for e in preorder(tree.getLeftChild()):
yield e
for e in preorder(tree.getRightChild()):
yield e
请注意,使用yield
或yield from
会将此功能转换为generator function;特别是,如果你想要一个实际的列表(例如用于索引,切片或显示),你需要明确地创建它:list(preorder(tree))
。
如果你有不同数量的孩子,它很容易适应:
def preorder(tree):
if tree:
yield tree
for child in tree.children:
yield from preorder(child)
答案 1 :(得分:2)
你必须实际返回来自递归函数的值(目前,它只是打印值)。您应该随时构建列表,并且可能会稍微清理一下代码 - 就像这样:
def preorder(tree):
if not tree:
return []
# optionally, you can print the key in this line: print(self.key)
return [tree.key] + preorder(tree.leftChild) + preorder(tree.rightChild)
答案 2 :(得分:1)
您可以向preorder
函数添加第二个参数,例如
def preorder(tree, visnodes):
if tree:
visnodes.append(tree.self.key)
print(tree.self.key)
preorder(tree.getLeftChild(), visnodes)
preorder(tree.getRightChild(), visnodes)
...
vn = []
preorder(tree, vn)
答案 3 :(得分:0)
您可以简单地为每个递归调用返回一个连接列表,它将当前键,左子树和右子树组合在一起:
def preorder(tree):
if tree:
return ([tree.key] + preorder(tree.getLeftChild()) +
preorder(tree.getRightChild()))
return []
对于n-ary树:
def preorder(tree):
if tree:
lst = [tree.key]
for child in tree.children:
lst.extend(preorder(child))
return lst
return []