Python:不使用条件的二叉树遍历迭代器

2024-06-09 20:04:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在python中创建一个模块,使用4个标准的树遍历(inorder、preorder、posterder和levelorder)遍历二叉树,而不使用条件,只使用多态方法dispatch或iterators。下面的例子应该有用。在

for e in t.preorder():
  print(e)
for e in t.postorder():
  print(e)
for e in t.inorder():
  print(e)
for e in t.levelorder():
  print(e)

到目前为止,我提出了以下几点

^{pr2}$

当我尝试运行一个迭代器时,比如在代码的底部,我得到一个 AttributeError:“NoneType”对象没有属性“inorder” 错误消息。我想这是因为我从不提出停止迭代。关于如何解决这个问题并开始实施levelorder有什么想法吗?在


Tags: 模块方法infor标准条件多态dispatch
1条回答
网友
1楼 · 发布于 2024-06-09 20:04:51

你说你不想用多态性。用一个支持方法但返回空序列的特殊对象替换代码中所有出现的“None”都将正常工作。在

另外,在发布Python问题时,您应该更加注意缩进。你发布的代码不会按原样运行。在

def build_tree(preord, inord):
    tree = BinaryTree()
    tree.root = buildTreeHelper(preord, inord)
    return tree

def buildTreeHelper(preorder, inorder):
    if len(inorder) == 0:
        return empty

    elem = preorder[0]
    elemInorderIndex = inorder.find(elem)

    if elemInorderIndex > -1:
        leftPreorder = preorder[1:elemInorderIndex + 1]
        rightPreorder = preorder[elemInorderIndex + 1:]
        leftInorder = inorder[0:elemInorderIndex]
        rightInorder = inorder[elemInorderIndex + 1:]
        left = buildTreeHelper(leftPreorder, leftInorder)
        right = buildTreeHelper(rightPreorder, rightInorder)
        return BinaryTreeNode(elem, left, right)
    else:
        return "No valid tree for the given args"

class BinaryTree:
    def __init__(self):
        self.root = empty
    def preorder(self):
        return self.root.preorder()
    def inorder(self):
        return self.root.inorder()
    def postorder(self):
        return self.root.postorder()

class EmptyNode:
    def preorder(self):
        return ()
    inorder = postorder = preorder
empty = EmptyNode()

class BinaryTreeNode:
    def __init__(self, element, left=empty, right=empty):
        self.element = element
        self.left = left
        self.right = right
    def preorder(self):
        yield self.element
        for e in self.left.preorder():
            yield e
        for e in self.right.preorder():
            yield e
    def inorder(self):
        for e in self.left.inorder():
            yield e
        yield self.element
        for e in self.right.inorder():
            yield e
    def postorder(self):
        for e in self.left.postorder():
            yield e
        for e in self.right.postorder():
            yield e
        yield self.element

if __name__ == "__main__":
    t = build_tree("BAC", "ABC")
    for e in t.inorder():
        print(e)

相关问题 更多 >