python - 如何用递归生成器遍历二叉树?

标签 python recursion iterator generator

我正在尝试遍历在以下代码中创建的二叉树。准确地说,二叉树是一个类,应该包含一个调用另一个函数的迭代器,即 inorder()。这个方法应该是一个递归生成器,并在每次迭代中产生节点的值。我试图创建一个字典来跟踪节点,但是当我尝试调用 inorder() 方法时,它不起作用。有什么我不知道的遗漏点吗?我使用了 while 并创建了树左侧的字典(这是一种笨拙的方式)。 请帮我完成这段代码。

d=[]

# A binary tree class.
class Tree(object):
    def __init__(self, label, left=None, right=None):
        self.label = label
        self.left = left
        self.right = right
        self.d=dict()
    def __repr__(self, level=0, indent="    "):
        s = level * indent + self.label
        if self.left:
            s = s + "\n" + self.left.__repr__(level + 1, indent)
        if self.right:
            s = s + "\n" + self.right.__repr__(level + 1, indent)
        return s

def traverse(self):
    if self.left:
        lastLabel=self.label
        self.left.traverse()
    if self.right:
        lastLabel=self.label
        d.append(lastLabel)
        self.right.traverse()
    else:
        d.append(self.label)
    return d

def __iter__(self):
    return inorder(self)

# Create a Tree from a list.
def tree(sequence):
    n = len(sequence)
    if n == 0:
        return []
    i = n / 2
    return Tree(sequence[i], tree(sequence[:i]), tree(sequence[i+1:]))

# A recursive generator that generates Tree labels in in-order.
def inorder(t):
    for i in range(len(d)):
        yield d[i]    

def test(sequence):
# Create a tree.
    t = tree(sequence)
# Print the nodes of the tree in in-order.
    result = []
    for x in t:
        result.append(x)
    print x
    print

    result_str = ''.join(result)

# Check result
    assert result_str == sequence
    del d[:]
def main():
    # Third test
    test("0123456789")

    print 'Success! All tests passed!'

if __name__ == '__main__':
    main()

我又改了代码 我完成了代码,但我确信这不是遍历二叉树的最佳方法。 我在我的类中定义了一个方法 -traverse()- 并返回了一个节点列表按顺序现在(起初没有排序,所以我使用了 sort() 方法。)然后我做了一个在我的生成器 inorder() 函数中遍历此列表以生成其中的元素。 非常欢迎您提出所有意见以优化代码。 请根据此代码中的特定 Tree 类推荐合适的解决方案。

最佳答案

也许我遗漏了什么,但我不确定为什么字典与 inorder() 相关。想一想一般的中序遍历是什么样的:

def inorder(t):
    # Process left sub tree
    # Process t
    # Process right sub tree

所以就生成器而言,这看起来像:

def inorder(t):
    if t.left:
        for elem in inorder(t.left):
            yield elem
    yield t
    if t.right:
        for elem in inorder(t.right):
            yield elem

关于python - 如何用递归生成器遍历二叉树?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14815765/

相关文章:

javascript - IPython notebook ~ 使用 javascript 运行 python 代码?

python - 对于从文件对话框加载图像有什么建议吗?

python递归返回无类型

c++ - 从 C++ 列表中删除元素的问题

python - 创建一个无法保存到数据库的 Django 演示用户

python - 使用 python 从时间列表中创建平均值

java - Java程序中的无限递归

java - 我的递归方法无法正确返回 char 出现的总数

java - 无法使用 Iterator 迭代 List,但在使用 for every 时工作正常

java - 为什么我不能将 List<Truck> 用作 Iterable<Vehicle>?