这个递归二叉树函数类型有一些错误

there is some error in this recursive binarytree function type

我尝试检查并修复代码,但我找不到此代码的任何问题

class Stack:
    def __init__(self):
        self.items = []

    def is_empty(self):
        return self.items == []

    def push(self, item):
        self.items.append(item)

    def pop(self):
        return self.items.pop()
    
    def peek(self):
        return self.items[len(self.items)-1]

    def size(self):
        return len(self.items)


class BinaryTree:
    def __init__(self, root):
        self.key = root
        self.left_child = None
        self.right_child = None

    def insert_left(self, new_node):
        if self.left_child == None:
            self.left_child = BinaryTree(new_node)
        else:
            t = BinaryTree(new_node)
            t.left_child = self.left_child
            self.left_child = t

    def insert_right(self, new_node):
        if self.right_child == None:
            self.right_child = BinaryTree(new_node)
        else:
            t = BinaryTree(new_node)
            t.right_child = self.right_child
            self.right_child = t

    def get_right_child(self):
        return self.right_child

    def get_left_child(self):
        return self.left_child
    
    def set_root_val(self, obj):
        self.key = obj

    def get_root_val(self):
        return self.key

    def preorder(tree):
        if tree:
            print(tree.get_root_val())
            preorder(tree.get_left_child())
            preorder(tree.get_right_child())

    def postorder(tree):
        if tree != None:
            postorder(tree.get_left_child())
            postorder(tree.get_right_child())
            print(tree.get_root_val())

    def inorder(tree):
        if tree != None:
            inorder(tree.get_left_child())
            print(tree.get_root_val())
            inorder(tree.get_right_child())


def build_parse_tree(fp_exp):
    fp_list = fp_exp.split()
    p_stack = Stack()
    e_tree = BinaryTree('')
    p_stack.push(e_tree)
    current_tree = e_tree
    for i in fp_list:
        if i == '(':
            current_tree.insert_left('')
            p_stack.push(current_tree)
            current_tree = current_tree.get_left_child()
        elif i not in ['+', '-', '*', '/', ')']:
            current_tree.set_root_val(int(i))
            parent = p_stack.pop()
            current_tree = parent
        elif i in ['+', '-', '*', '/']:
            current_tree.set_root_val(i)
            current_tree.insert_right('')
            p_stack.push(current_tree)
            current_tree = current_tree.get_right_child()
        elif i == ')':
            current_tree = p_stack.pop()
        else:
            raise ValueError
    return e_tree

if __name__ == '__main__':
    pt = build_parse_tree("( ( 10 + 5 ) * ( 3 - 2 ) )")
    pt.postorder()

我 运行 代码,它 return 我用这个

name 'postorder' is not defined
  File "G:\VSCode\PythonVS\BinaryTree6Feb2022.py", line 63, in postorder
    postorder(tree.get_left_child())
  File "G:\VSCode\PythonVS\BinaryTree6Feb2022.py", line 102, in <module>
    pt.postorder()

我试图使它成为一个递归函数,但我不知道我做错了什么或者我可能遗漏了什么。 我仍在检查代码,但我就是找不到遗漏的东西

您的遍历方法 preorderpostorderinorder 具有独立 函数 所期望的声明,但它们缩进为成为 class 的一部分,因此它们看起来像 methods.

最简单的解决方法是将它们移出 class 块,并用 postorder(pt) 替换主程序中的调用,这样就可以了。

如果您希望在 class 上将它们作为 方法 ,以便您可以像 pt.postorder() 那样进行调用,则将参数重命名为 treeself(这是通常的做法),在 method-notation 中进行递归调用,并在递归调用之前移动 if 条件:

    def postorder(self):
        print(self.get_root_val())
        if self.get_left_child():
            self.get_left_child().postorder()
        if self.get_right_child():
            self.get_right_child().postorder()

为了完整起见,我还提供了一个在开始时保留 if 条件的替代方案,但是您必须在递归调用上使用另一种语法,因为您不能在 [=22= 上调用方法]:

    def postorder(self):
        if self:
            print(self.get_root_val())
            BinaryTree.postorder(self.get_left_child())
            BinaryTree.postorder(self.get_right_child())

但这在 Python 中并不常见。