gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:20:48 25 4
gpt4 key购买 nike

我正在尝试遍历在以下代码中创建的二叉树。准确地说,二叉树是一个类,应该包含一个调用另一个函数的迭代器,即 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com