AttributeError: type object 'BSTNode' has no attribute 'left'

AttributeError: type object 'BSTNode' has no attribute 'left'

我试图在 python 中构建二叉搜索树。 这是我的节点 class:

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

这个 class 包含一个名为 printTree 的函数,它应该按顺序打印树。这是 printTree 函数:

def printTree(self,val):
    if self.left is not None:
        self.left.printTree()
    print(self.val)
    if self.right is not None:
        self.right.printTree()

当我执行函数时它给出 AttributeError: type object 'BSTNode' has no attribute 'left'

这是我的完整代码:

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

    def insertNode(self,val):
        if self.val:
            if val < self.val:
                if self.left is None:
                    self.left = BSTNode(val)
                else:
                    self.left.insertNode(val)
            else:
                if self.right is None:
                    self.right = BSTNode(val)
                else:
                    self.right.insertNode(val)
        else:
            self.val = val

    def findval(self,fval):
       if (fval == self.val):
           print(str(self.val)," data found ")
       elif(fval < self.val):
            if self.left is None:
                print(str(self.val)," data not found")
            else:
                self.left.findval(fval)
       else:
           if self.right is None:
               print(str(self.val)," data not found")
           else:
               self.right.findval(fval)

    def printTree(self,val):
        if self.left is not None:
            self.left.printTree()
        print(self.val)
        if self.right is not None:
            self.right.printTree()
            
    

root = BSTNode(12)
root.insertNode(6)
root.insertNode(5)
root.insertNode(18)
root.insertNode(15)
root.insertNode(21)
BSTNode.printTree(BSTNode)
  1. 您在调用 printTree() 时没有参数:
self.left.printTree()
...
self.right.printTree()

然而,您将其定义为接受 val,顺便说一句,它未被使用:

def printTree(self,val):

替换为:

def printTree(self):
  1. 方法 printTree() 是一个实例方法,不是 @classmethod 也不是 @staticmethod。这意味着它需要调用 BSTNode 的活动 instance/object,它将作为 self 参数传递。所以这个调用是不正确的:
BSTNode.printTree(BSTNode)

必须是:

root.printTree(BSTNode)

那么考虑到我上面的第1点,最后应该是:

root.printTree()

其中 root 是类型 BSTNode 的当前活动实例。

经过这些修复后,它就会成功

5
6
12
15
18
21

备选方案

如果您不希望 printTree() 成为实例方法,请将其设为 @staticmethod

class BSTNode:
    ...
    @staticmethod
    def printTree(self):  # I named it self to be close to your real implementation. Ideally, rename it to something like "node" or "obj" to avoid confusion since this is not an instance method.
        if self.left is not None:
            self.printTree(self.left)
        print(self.val)
        if self.right is not None:
            self.printTree(self.right)
...
BSTNode.printTree(root)

这将产生相同的输出。