我的代码片:https://code.csdn.net/snippets_manage
# BST为二叉搜索树的实现文件
import BST
''' 功能:往平衡二叉树中插入一个结点 参数: N:要插入的结点 '''
def BInsert(N):
# 调用二叉树的插入函数插入元素
BST.Insert(N)
# 找出刚插入的元素,更新结点的高度height
N = BST.Find(N, root)
Rebalancce(N)
''' 功能:删除AVL树中的一个结点 参数: N:要删除的结点 '''
def BDelete(N):
# 调用普通二叉搜索树搜索函数删除结点
p = N.parent
BSTDelete(N)
# 重新建立平衡二叉树
Rebalance(p)
''' 功能:返回x,y之间的所有结点 参数: (x,y):要查找的键值区间 root: 树的根节点 '''
def BRangeSearch(x, y, root):
# 此操作不会破会平衡二叉树的性质,直接调用普通二叉树的相关函数即可
T = BSTRangeSearch(x, y, root)
return T
''' 功能:调整结点N的高度height 参数:结点N '''
def AdjustHeight(N):
N.height = 1 + max(N.left.height, N.right.height)
return
''' 功能:重建平衡树的性质 参数:不满足平衡树性质的结点 '''
def Rebalance(N):
p = N.parent
# 如果左子树过重,则右旋
if N.left.height > N.right.height + 1:
RebalanceRight(N)
# 如果右子树过重,则左旋
if N.right.height > N.left.height + 1:
RebalanceLeft(N)
# 调整结点的高度
AdjustHeight(N)
if p != None:
Rebalance(p)
''' 功能:LR型旋转或者LL型旋转 参数: N:破坏点 '''
def RebalanceRight(N):
M = N.left
# LR型旋转
if M.right.height > M.left.height:
# 左旋
RotateLeft(M)
# 右旋
RotateRight(N)
''' 功能:RL型旋转或者RR型旋转 参数: N:破坏点 '''
def RebalanceLeft(N):
M = N.right
# RL型旋转
if M.left.height > M.right.height:
# 右旋
RotateRight(M)
# 左旋
RotateLeft(N)
''' 功能:右旋 参数: N:破坏点 '''
def RotateRight(N):
# N的左孩子结点M替代N
# N成为M的右孩子结点
# M的右孩子结点B成为N的左孩子
p = N.parent
M = N.left
B = M.right
# N的左孩子结点M替代N
M.parent = p
if p != None:
if N == N.parent.left:
N.parent.left = M
else:
N.parent.right = M
# N成为M的右孩子结点
M.right = N
N.parent = M
# M的右孩子结点B成为N的左孩子结点
if B != None:
N.left = B
B.parent = N
else:
N.left = None
# 调整结点高度(N,M的高度可能发生改变)
AdjustHeight(N)
AdjustHeight(M)
''' 功能:左旋 参数: N:破坏点 '''
def RotateLeft(N):
# N的右孩子结点M替代N
# N成为M的左孩子结点
# M的左孩子结点B成为N的右孩子结点
p = N.parent
M = N.right
B = M.left
# M替代N结点
M.parent = p
if p != None:
if N == p.left:
p.left = M
else:
p.right = M
# N成为M的左孩子结点
N.parent = M
M.left = N
# B成为N的右孩子结点
if B != None:
B.parent = N
N.left = B
else:
N.left = None
# 更新M,N结点的高度
AdjustHeight(N)
AdjustHeight(M)