【发布时间】:2021-07-03 21:49:25
【问题描述】:
我正在尝试使用 Node 类和 Tree 类在 python 中递归实现二叉搜索树。
# MAKE CUSTOM ERROS
class Error(Exception):
pass
class InvalidKeyError(Error):
pass
# TREE NODE CLASS
class TreeNode():
def __init__(self, inKey, inValue): # eahc node has a key with an associated value
self._key = inKey
self._value = inValue
self._left = None
self._right = None
def __str__(self): # Used for printing
return ("Key: " + str(self._key) + " Value: " + str(self._value))
# SEARCH TREE CLASS
class BinarySearchTree():
def __init__(self):
self._root = None # start with an empty tree
# Wrapper method
def find(self, key):
return self._findRec(key, self._root)
def _findRec(self, key, cur):
value = None
if cur == None:
raise InvalidKeyError("Key " + str(key) + " not found")
elif key == cur._key: # Base case: found
value = cur._value
elif key < cur._key: # goes left
value = self._findRec(key, cur._left)
else: # goes right
value = self._findRec(key, cur._right)
return value
# Wrapper method
def insert(self, key, data):
return self._insertRec(key, data, self._root)
def _insertRec(self, key, data, cur):
updateNode = cur
if cur == None:
updateNode = TreeNode(key, data)
elif key == cur._key: # in the tree
raise InvalidKeyError("Key " + str(key) + " is already in the tree")
elif key < cur._key:
cur._left = self._insertRec(key, data, cur._left)
else:
cur._right = self._insertRec(key, data, cur._right)
return updateNode
# TESTING
if __name__ == "__main__":
myTree = BinarySearchTree()
myTree.insert(9, "nine")
myTree.insert(5, "five")
myTree.insert(13, "thirteen")
print(myTree.find(13))
在我的树中插入键/值时我没有收到任何错误,但我在尝试在树中查找节点时收到错误。
InvalidKeyError: Key 13 not found p>
我的插入方法是否存在逻辑错误?谢谢!
【问题讨论】:
-
从第 31 行抛出错误 raise InvalidKeyError("Key " + str(key) + " not found") 如果您查看前一行,您将看看为什么。
-
树没有正确构建,或者您没有正确搜索它。我会首先编写一个函数来输出整个树,这样你就可以确定它是否正确构建。
-
这里的问题是你从来没有设置
self._root。它总是无,所以find首先失败了。一些调试打印就会向您展示这一点。 -
我们还希望您在错误点之前跟踪可疑值。您对他们如何达到这些价值观感到困惑?
标签: python class recursion data-structures binary-search-tree