class BinarySerachTree:
def __init__(self):
self.root=None
self.size=0
def length(self):
return self.size
def put(self,key,val):
if self.root:
self._put(key,val,self.root)
else :
self.root=TreeNode(key,val)
self.size+=1
def _put(self,key,val,currentNode):
if key <currentNode.key:
if currentNode.hasLeftChild():
self._put(key,val,currentNode.leftChild)
else :
currentNode.leftChild=TreeNode(key,val,parent=currentNode)
elif key > currentNode.key:
if currentNode.hasRightChild():
self._put(key,val,currentNode.rightChild)
else :
currentNode.rightChild=TreeNode(key,val,parent=currentNode)
else :
currentNode.replaceNodeData(key,val,currentNode.leftChild,currentNode.rightChild)
def get(self,key):
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 key < currentNode.key :
if currentNode.hasLeftChild():
return self._get(key,currentNode.leftChild)
else :
return None
elif key > currentNode.key :
if currentNode.hasRightChild():
return self._get(key,currentNode.rightChild)
else :
return None
else :
return currentNode
def gethead(self,currentNode):
if currentNode.leftChild and currentNode.rightChild:
return 1+max(self.gethead(currentNode.leftChild),self.gethead(currentNode.rightChild))
elif currentNode.leftChild is None and currentNode.rightChild is not None :
return 1+self.gethead(currentNode.rightChild)
elif currentNode.leftChild is not None and currentNode.rightChild is None :
return 1+self.gethead(currentNode.leftChild)
else :
return 0
def __getitem__(self,key):
return self.get(key)
def __setitem__(self,k,v):
self.put(k,v)
def __len__(self): #为了可以使用len()来查看长度
return self.size
def __iter__(self): #为了可以使用迭代算法
return self.root.__iter__()
def __contains__(self,key):
if self.get(key):
return True
else :
return False
def delete(self,key):
if self.size > 1:
nodeToRemove=self._get(key,self.root)
if nodeToRemove:
python实现 平衡二叉搜索树(AVL树)
最新推荐文章于 2023-03-25 00:32:24 发布