【问题标题】:Recursive Postorder Traversal to List in Python?递归后序遍历到 Python 中的列表?
【发布时间】:2013-11-05 17:51:26
【问题描述】:

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

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

我想要的不是打印遍历,而是让函数将该信息存储在数组或类似的东西中,这样我就可以将该信息用于其他事情

【问题讨论】:

  • Aaron:请注意,python 的(默认)限制为 2000 帧。这意味着任何递归解决方案都会在大输入时出现 StackOverflowError。这就是为什么我总是对非递归堆栈/队列解决方案进行第二步重构。
  • @bukzor 即使没有完美平衡的二叉树,您也更有可能在堆栈帧用完之前耗尽内存
  • @Izkata:长度为 3000 的链表(又名完美不平衡树)将很容易适应内存。在我的粗略资料中,它花了 22MB。

标签: python list tree tree-traversal


【解决方案1】:

你可以这样做:

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

【讨论】:

    【解决方案2】:

    你可以传入一个可调用对象,或者你可以编写一个生成器:

    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).
    猜你喜欢
    • 2014-03-01
    • 2019-08-03
    • 2010-12-01
    • 1970-01-01
    • 2016-04-30
    • 2018-11-11
    • 2021-10-11
    • 1970-01-01
    • 2023-03-29
    相关资源
    最近更新 更多