如何解决如何修复 Python 二叉搜索树中的 NoneType 错误?
我正在创建一个基本的二叉搜索树程序,其中节点必须是字符串,但是,我不断收到此错误:
'builtins.AttributeError: 'NoneType' object has no attribute 'addNode'
我有点困惑,因为我认为您必须将子节点声明为 None。我的代码如下(请原谅混乱和额外的打印语句):
class BinarySearchTree:
#constructor with insertion value & left/right nodes as None
def __init__(self,data):
self.data = data
self.left = None
self.right = None
#function to insert node
def addNode(root,data):
#when tree doesn't exist
if root == None:
return BinarySearchTree(data)
else:
#when node is already in tree
if root.data == data:
return root
#smaller values go left
elif data < root.data:
root.left.addNode(data)
#bigger values go right
else:
root.right.addNode(data)
return root
#function to find smallest node value (to help with deletion)
def smallestNode(root):
node = root
#loop goes to lowest left leaf
while(node.left is not None):
node = node.left
return node
#function to delete node
def removeNode(root,data):
if root == None:
return root
#when node to be deleted in smaller than root,go left
if data < root.data:
root.left = root.left.removeNode(data)
#when node to be deleted in bigger than root,go right
elif data > root.data:
root.right = root.right.removeNode(data)
##when node to be deleted in the same as root...
else:
#when node has only 1 or 0 children
if root.right == None:
move = root.left
root = None
return move
elif root.left == None:
move = root.right
root = None
return move
#when node has 2 children,copy then delete smallest node
move = root.right.smallestNode()
root.data = move.data
root.right = root.right.removeNode(move.data)
return root
def findNode(root,data):
#if current node is equal to data value then return the root
if root.data == data or root == None:
return root
#if current node is greater than the data value then,search to the left
elif data < root.data:
return root.left.findNode(data)
#if current node is less than the data value then,search to the right
else:
return root.right.findNode(data)
def createBST(keys):
root = BinarySearchTree(keys[0])
for i in range(1,len(keys)):
root.addNode(keys[i])
return root
print('Hi! Welcome to the Binary Search Tree Builder')
print('Here are your options below:')
print('1) Build new tree')
print('2) Add a node')
print('3) Find a node')
print('4) Delete a node')
choice = int(input('What would you like to do?: '))
if choice == 1:
nodes = list(input("Enter the strings you would like to build your tree from (separate by a space): ").split())
print(nodes)
tree = createBST(nodes)
print(tree)
我想知道这个错误究竟来自哪里,我该如何解决?另外,如果您发现我的代码中出现任何其他问题,请告诉我!
解决方法
您混淆了“树节点”和“树”的概念。你所拥有的是两者的混合体。请记住,所有成员函数的第一个参数应该是“self”。将“root”替换为“self”可能会使您的问题更加清晰。
因此,一旦您有了节点,您就可以创建一个 BinaryTree
类,该类有一个名为 self.root
的成员,该成员保存一个 BinaryTreeNode
对象。节点将保存 left
和 right
值,每个值都有 None
或 BinaryTreeNode
对象。节点类可能不需要太多代码——只需 self.left
和 self.right
。
BinaryTree
类将有一个 addNode
成员,它知道如何遍历树找到正确的位置,但是当您找到位置时,只需设置 self.left = BinaryTreeNode(...)
。一个节点不知道这棵树,所以一个节点不知道如何添加新节点。这是树本身的功能。
这是否会让您的前进道路更加清晰?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。