如何解决Python递归二叉搜索树
我正在尝试使用 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,data):
return self._insertRec(key,data,self._root)
def _insertRec(self,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,cur._left)
else:
cur._right = self._insertRec(key,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
解决方法
递归插入的东西行不通。当您注意到您的节点为空时,您不再需要修改任何内容。这似乎有效:
def _insertRec(self,key,data,cur):
newnode = TreeNode(key,data)
if not self._root:
self._root = newnode
return
while key != cur._key:
if key < cur._key:
if not cur._left:
cur._left = newnode
return
cur = cur._left
else:
if not cur._right:
cur._right = newnode
return
cur = cur._right
raise InvalidKeyError("Key " + str(key) + " is already in the tree")
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。