我的代码片:https://code.csdn.net/snippets_manage
'''
功能:在二叉搜索树中查找一个元素,若该元素存在则返回该元素,否则返回该元素若存在时的父母结点
参数:
key:结点的键值
root:二叉树的根节点
'''
def Find(key, root):
# 若该树为空树或者根节点的键值等于key,则返回根节点
if root == None or root.key == key:
return root
# 若该树非空,且key不等于根节点的键值,则先判读key值对应的结点在root的左子树还是右子树
# 若key小于root的键值,那么key值对应的结点在root的左子树
if root.key > key:
# 若root的左子树存在,递归查找
if root.left != None:
return Find(key, root.left)
# 若root的左子树不存在,key对应的结点不存在,返回root
return root
# 若key大于root的键值,在root的右子树中查找key对应的结点
if root.key < key:
# 若root的右子树存在,递归查找
if root.right != None:
return Find(key, root)
# 否则直接返回root
return root
'''
功能:往书中插入一个结点
参数:N
'''
def Insert(N):
# 找出N的父母节点
M = Find(N)
# 若N的键值小于M的键值,则N为M的左孩子结点
if M.key >N.key:
M.left = N
N.parent = M
# 否则N为M的右孩子结点
else:
M.right = N
N.parent = M
'''
功能:返回大于键值key的最小结点,若key是二叉树中最大的结点,则返回key对应的结点
参数:
N:二叉树的某一结点
'''
def Next(N):
# 如果N有右孩子树,返回N的右孩子树的左孩子叶子结点
M = Find(max, root)
if M == N:
return N
if N.right != None:
return LeftDescendant(N.right)
# 如果N没有右孩子结点,返回N的右父母结点
if N.right == None:
return RightAncenstor(N)
def LeftDescendant(N):
if N.left == None or N == None:
return N
return LeftDesendant(N.left)
def RightAncenstor(N):
if N == N.parent.left:
return N.parent
return LeftAncenstor(N.parent)
'''
功能:删除输入结点
参数:
N:要删除的结点
'''
def Delete(N):
# 若N没有右孩子结点,N的父母结点指向N的左孩子结点
if N.right == None:
N.left.parent = N.parent
# 若N是右孩子结点
if N.parent.right == N:
N.prent.right = N.left
return
# 若N是左孩子结点
if N.parent.left == N:
N.parent.left = N.left
return
# 若N有右孩子结点
else:
# 查找大于N的最小结点
x = Next(N)
# 用x替代N
N.key = X.key
# 删除x,由于x一定是左孩子结点
x.parent.left = None
return
'''
功能:输出键值在x,y之间的一系列结点
参数:x,y,root
'''
def RangeRearch(x, y, root):
L = []
N = Find(x, root)
while N != False and N.key <= y:
if N.key >= x:
L.append(N)
N = Next(x)
return L
'''
功能:将两棵树合成
参数:R1,R2(R1中的元素小于R2)
'''
def Merge(R1, R2):
# 在R1中找出最大的元素,作为合成树的根节点
R = Find(max, R1)
# 删除R
Delete(R)
# 合成树
MergeWithRoot(R1, R2, R)
return R
def MergeWithRoot(R1, R2, R):
# R1作为R的左子树
R.left = R1
R1.parent = R
# R2作为R的右子树
R.right = R2
R2.parent = R
return R
'''
功能:将树R分割成两棵树R1和R2(R1的元素均小于x,R2的元素均大于x)
参数:树的根节点R, 分割的键值
'''
def Split(x, R):
if R == None:
return (None, None)
if R.key >= x:
(R1, R2) = Split(x, R.left)
R3 = MergeWithRoot(R2, R.right, R)
return (R1, R3)
if x > R.key:
(R1, R2) = Split(x, R.right)
R3 = MergeWithRoot(R1, R.left, R)
return (R3, R2)