二叉搜索树的实现:BST.put方法
put(key,val)方法:插入key构造BST
首先看BST是否为空,如果一个节点都没有,那么key成为根节点root 否则,就调用一个递归函数_put(key, val, root)来放置key
def put(self,key,val):
if self.root:
self._put(key, val, self.root) #哪里有根节点就插入key
else:
self.root = TreeNode(key, val)
self.size = self.size + 1
_put(key, val, currentNode)的流程
如果key比currentNode小,那么_put到左子树,但如果没有左子树,那么key就成为左子节点 如果key比currentNode大,那么_put到右子树,但如果没有右子树,那么key就成为右子节点
def _put(self,key,val,currentNode):
if key < currentNode:
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)
二叉搜索树的实现:索引赋值
随手把__setitem__做了
特殊方法(前后双下划线)
def __setitem__(self, k, v)
self.put(k, v)
BST.put图示
二叉搜索树的实现:BST.get方法
#在树中找到key所在的节点取到payload
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 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)
二查搜索树的实现:索引和归属判断
__getitem__特殊方法 __contains__特殊方法
def __getitem__(self, key):
return self.get(key)
def __contains__(self, key):
if self._get(key, self.root):
return True
else:
return False
迭代器
我们可以用for循环枚举字典中所有的key 特殊方法__iter__可以用来实现for迭代
#迭代器函数中用了for迭代,实际上是递归函数yield是对每次迭代的返回值
def __iter__(self):
if self:
if self.hasRightChild():
for elem in self.leftChild:
yield elem
yield self.key
if self.hasRightChild():
for elem in self.rightChild:
yield elem