首页 > 解决方案 > 在二叉搜索树算法中存在递归问题

问题描述

我在尝试在 python 中编写递归预排序算法时遇到问题。这是说我的preOrder功能没有定义。

NameError: name 'preOrder' is not defined

class Node():
    def __init__(self,val):
        self.val = val
        self.right = None
        self.left = None
    def preOrder(key):
        if key:
            print(key.val)
            preOrder(key.left)
            preOrder(key.right)

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)
root.preOrder()

我正在运行 Windows 并使用 Atom 文本编辑器。

标签: python

解决方案


选项1

如果您想preOrder成为一个单独的静态方法,您可以简单地将代码取消缩进:

class Node():
    def __init__(self,val):
        self.val = val
        self.right = None
        self.left = None

def preOrder(key):
    if key:
        print(key.val)
        preOrder(key.left)
        preOrder(key.right)

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)
preOrder(root)

因为这现在是一个静态方法,请注意最后一行也发生了变化

选项 2

您可以使 preOrder 成为静态类方法,如下所示:

class Node():
    def __init__(self,val):
        self.val = val
        self.right = None
        self.left = None

    @staticmethod
    def preOrder(key):
        if key:
            print(key.val)
            Node.preOrder(key.left)
            Node.preOrder(key.right)

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)
Node.preOrder(root)

请注意您现在需要如何调用Node.preOrder

选项 3

我们可以使它成为每个类的方法,如下所示:

class Node():
    def __init__(self,val):
        self.val = val
        self.right = None
        self.left = None

    def preOrder(self):
        print(self.val)
        if self.left:
            self.left.preOrder()
        if self.right:
            self.right.preOrder()

root = Node(1)
root.left = Node(2)
root.right = Node(3)
root.left.left = Node(4)
root.left.right = Node(5)
root.right.left = Node(6)
root.right.right = Node(7)
root.preOrder()

这是保留调用的原始语法的唯一方法。注意函数参数是如何变化的。


推荐阅读