BST树
二分查找树是左子节点小于根节点,根节点小于右子节点的树形数据结构,有利于数据的快速定位,该python实现,含有两个类,TreeNode和BinarySearchTree,下面逐行注释代码方便理解
class BinarySearchTree:
def __init__(self):
# 定义根节点
self.root = None
# 用于记录树的大小,即树中有多少个node
self.size = 0
def put(self,key,val):
# 新node加入树中
if self.root:
self._put(key,val,self.root)
else:
self.root = TreeNode(key,val)
self.size = self.size + 1
def _put(self,key,val,currentNode):
# 如果key小于根节点key则插入左子树,如果key大于根节点key则插入右子树
if key < currentNode.key:
if currentNode.hasLeftChild():
self._put(key,val,currentNode.leftChild)
else:
currentNode.leftChild = TreeNode(key,val,parent=currentNode)
else:
if currentNode.hasRightChild():
self._put(key,val,currentNode.rightChild)
else:
currentNode.rightChild = TreeNode(key,val,parent=currentNode)
def __setitem__(self,k,v):
self.put(k,v)
def get(self,key):
# 通过key过去bst树的val
if self.root:
res = self._get(key,self.root)
if res:
return res.payload
else:
return None
else:
return None
def _get(self,key,currentNode):
if not currentNode:
return None
elif currentNode.key == key:
return currentNode
elif key < currentNode.key:
return self._get(key,currentNode.leftChild)
else:
return self._get(key,currentNode.rightChild)
def __getitem__(self,key):
# 用于类似map的访问比如a['key']=
res = self.get(key)
if res:
return res
else:
raise KeyError('Error, key not in tree')
def __contains__(self,key):
# 用于判断是否含有key
if self._get(key,self.root):
return True
else:
return False
def length(self):
return self.size
def __len__(self):
return self.size
def __iter__(self):
return self.root.__iter__()
# 删除bst树中的节点
def delete(self,key):