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)
- 您在调用
printTree()
时没有参数:
self.left.printTree()
...
self.right.printTree()
然而,您将其定义为接受 val
,顺便说一句,它未被使用:
def printTree(self,val):
替换为:
def printTree(self):
- 方法
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)
这将产生相同的输出。
我试图在 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)
- 您在调用
printTree()
时没有参数:
self.left.printTree()
...
self.right.printTree()
然而,您将其定义为接受 val
,顺便说一句,它未被使用:
def printTree(self,val):
替换为:
def printTree(self):
- 方法
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)
这将产生相同的输出。