python从递归方法返回一个列表

时间:2015-04-18 14:48:29

标签: python recursion binary-tree preorder

我正在使用本书中描述的二叉树 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 ...

有什么想法吗?

4 个答案:

答案 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

请注意,使用yieldyield 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 []