BST搜索树:在一个二叉搜索树中,如果左子树中键值Key都小于父节点,而右子树中键值Key都大于父节点,我们将这种树称为BST搜索树。
注意:移动树的节点时,被移动节点及其原新两个位置的父、子节点的指向均需重新指向,保证各节点指向正确。
示例:
# 创建树的节点类
class TreeNode(object):
# 初始化树的节点
def __init__(self, key, val, left=None, right=None, parent=None):
self.key = key #节点值,节点位置,索引
self.payload = val #有效载荷,节点显示的值
self.leftChild = left #左子节点
self.rightChild = right #右子节点
self.parent = parent #父节点
# 判断是否有左子节点,若有则返回左子节点
def hasLeftChild(self):
return self.leftChild
# 判断是否有右子节点,若有则返回右子节点
def hasRightChild(self):
return self.rightChild
# 判断是否是左子节点(父节点存在,并且self与self父节点的左子节点相同)
def isLeftChild(self):
# 下面的含义是(self.parent is not None) and (self.parent.leftChild == self)
return self.parent and self.parent.leftChild == self
# 判断是否是右子节点
def isRightChild(self):
return self.parent and self.parent.rightChild == self
# 判断是否是根节点
def isRoot(self):
return not self.parent #没有父节点
# 判断是否是叶节点
def isLeaf(self):
return not (self.rightChild or self.leftChild) #没有左右子节点
# 判断是否有子节点
def hasAnyChildren(self):
return self.rightChild or self.leftChild #有左或右子节点
# 判断是否有2个子节点
def hasBothChildren(self):
return self.rightChild and self.leftChild #有左右2个子节点
# 替换节点数据
def replaceNodeData(self, key, value, lc, rc):
self.key = key #更新节点值
self.payload = value #更新有效载荷
self.leftChild = lc #更新左子节点
self.rightChild = rc #更新右子节点
if self.hasLeftChild(): #若有左子节点
self.leftChild.parent = self #将该节点的左子节点的父节点指向self
if self.hasRightChild(): #若有右子节点
self.rightChild.parent = self #将该节点的右子节点的父节点指向self
# 中序遍历
# 只要用了yield语句,普通函数就是生成器,也是迭代器,在定义过程中不需要像迭代器那样写__iter__()和__next__()方法。yield语句的作用就是在调用的时候返回相应的值和作为生成器的标志。
def __iter__(self):
if self: #若当前节点存在,则
if self.hasLeftChild(): #若当前节点有左子节点,则
for elem in self.leftChild: #循环输出当前节点的左子树的节点值
yield elem #在for循环中,每次执行到yield时,就返回一个迭代值,且不会终止循环;下个循环时,代码从yield返回值的下