Python中的递归后序遍历转换为列表?

6

大家好,我是一名编程新手,以下是我的非常简单的代码:

def postorder(T):
    if T != None:
        postorder(T.left)
        postorder(T.right)
        print T.data,

我希望的是,不是输出遍历结果,而是将该函数所获取的信息存储在数组或类似的数据结构中,这样我就可以将该信息用于其他用途。


请注意,Python有一个(默认)2000帧的限制。这意味着任何递归解决方案都会在大量输入时出现StackOverflowError。这就是为什么我总是要进行第二步重构,转换成非递归的堆栈/队列解决方案。 - bukzor
即使没有完美平衡的二叉树,你在耗尽堆栈帧之前更有可能耗尽内存。@bukzor - Izkata
@Izkata: 长度为3000的链表(也称为完全不平衡树)将很容易地适合于内存中。在我的大致概要中,它只占用了22MB。 - bukzor
2个回答

9

您可以做:

def postorder(tree):
    data = []

    def recurse(node)
        if not node:
            return
        recurse(node.left)
        recurse(node.right)
        data.append(node.data)

    recurse(tree)
    return data

内部函数recurse负责遍历树形结构,数据会自动添加到data中。


1
你可以传入可调用对象,或者编写一个生成器:
def postorder(T):
    if T != None:
        postorder(T.left)
        postorder(T.right)
        print T.data,

def postorder_func(T, f):
    if T != None:
        postorder_func(T.left, f)
        postorder_func(T.right, f)
        f(T.data)

def postorder_gen(T):
    if T != None:
        for i in postorder_gen(T.left):
            yield i
        for i in postorder_gen(T.right):
            yield i
        yield T.data


class T:
    def __init__(self, left = None, data = None, right = None):
        self.left = left
        self.data = data
        self.right = right

one_half = T(data=.5)
three_halves = T(data=1.5)
one = T(one_half, 1, three_halves)
three = T(data=3)
root = T(one, 2, three)

postorder(root)
print ""

a = []
postorder_func(root, a.append)
print a

a = list(postorder_gen(root))
print a

或者,一行解决方案:
def postorder_one(T):
    return [] if T is None else postorder_one(T.left)+[T.data]+postorder_one(T.right)

在Python 3.3+中:yield from postorder_gen(T.left) - Simeon Visser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接