我正在尝试实现一个二叉搜索树,我相信我的插入方法逻辑非常好,但是我的代码在运行它时抛出了“超过比较的最大递归深度”错误。
更新:我编辑了我的代码以修复最大递归深度,但现在我得到了一个不同的属性错误。
以下是我更新的代码:
class BSTNode:
def __init__(self, key, value=None):
self.key = key
self.value = value
self.left = None
self.right = None
class BST:
def __init__(self):
self.root = None
self.size = 0
def insert(self, key, value):
if self.root is None:
self.root = BSTNode(key, value)
elif key < self.root.key:
if self.root.left is None:
self.root.left = BSTNode(key, value)
else:
self.root.left.insert(key, value)
elif key > self.root.key:
if self.root.right is None:
self.root.right = BSTNode(key, value)
else:
self.root.right.insert(key, value)
return self.root
if __name__ == '__main__':
T = BST()
T.insert(5, 'Mujeeb')
T.insert(4, 'Hamza')
T.insert(7, 'Ayesha')
T.insert(9, 'Mahnoor')
T.insert(11, 'Ali')
print(T.root.right.key)
我得到的错误:
---------------------------------------------------------------------------
RecursionError Traceback (most recent call last)
<ipython-input-29-1eef6d5c8be5> in <module>
23 T = BST()
24 T.insert(5, 'Mujeeb')
---> 25 T.insert(4, 'Hamza')
26 T.insert(7, 'Ayesha')
27
<ipython-input-29-1eef6d5c8be5> in insert(self, key, value)
15 self.root = BSTNode(key, value)
16 elif key < self.root.key:
---> 17 self.root.left = self.insert(key, value)
18 elif key > self.root.key:
19 self.root.right = self.insert(key, value)
... last 1 frames repeated, from the frame below ...
<ipython-input-29-1eef6d5c8be5> in insert(self, key, value)
15 self.root = BSTNode(key, value)
16 elif key < self.root.key:
---> 17 self.root.left = self.insert(key, value)
18 elif key > self.root.key:
19 self.root.right = self.insert(key, value)
RecursionError: maximum recursion depth exceeded in comparison
更新后的代码带来的新错误:
AttributeError Traceback (most recent call last)
<ipython-input-23-8ebfd3bbaceb> in <module>
30 if __name__ == '__main__':
31 T = BST()
---> 32 T.insert(5, 'Mujeeb')
33 T.insert(4, 'Hamza')
34 T.insert(7, 'Ayesha')
<ipython-input-23-8ebfd3bbaceb> in insert(self, key, value)
14 if self.root is None:
15 self.root = BSTNode(key, value)
---> 16 self.root.insert(key, value)
17 elif key < self.root.key:
18 if self.root.left is None:
AttributeError: 'BSTNode' object has no attribute 'insert'
如果你能提供任何指标来说明我在这方面出了什么问题,我将不胜感激,谢谢。
您的“插入”节点始终在树的根节点上运行。它应该在它插入的任何节点上运行。
如果您对节点使用单个类而不是类,对树使用另一个类,也许会更容易,这样,每个节点都将有自己的“插入”方法来做正确的事情。
class BSTNode:
def __init__(self, key, value):
self.key = key
self.value = value
self.left = None
self.right = None
def insert(self, key, value):
if key <= self.key:
if not self.left:
self.left = BSTNode(key, value)
else:
self.left.insert(key, value)
elif key > self.key:
if not self.right:
self.right = BSTNode(key, value)
else:
self.right.insert(key, value)