AttributeError:类型对象“BSTNode”没有属性“left”

2024-09-25 00:29:25 发布

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

我试图用python构建一个二进制搜索树。 这是我的节点类:

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

这个类包含一个名为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对象“BSTNode”没有属性“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)

Tags: selfrightnoneifisdefnotval
1条回答
网友
1楼 · 发布于 2024-09-25 00:29:25
  1. 您正在调用printTree(),但没有参数:
self.left.printTree()
...
self.right.printTree()

但是,您将其定义为接受val,顺便说一句,它是未使用的:

def printTree(self,val):

替换为:

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

它必须是:

root.printTree(BSTNode)

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

root.printTree()

其中rootBSTNode类型的当前活动实例

在这些修复之后,它将是成功的

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)

这将产生相同的输出

相关问题 更多 >