AVL树的删除很多教材上都没有提供,本人对AVL树有着较为深入的研究。现在晒出大体的算法思想。
3.2
.1
递归法
递归实现
AVL
树的结点删除的思想如下。
在
AVL
树
T
上删除值为
E
的结点步骤如下:
(1)
若树
T
为空,返回
0
退出否则到(
2
)
;
(2)
比较
T
的数据和
E
,若相等跳到(
3
),若
E
小于
T->data
跳到(
4
),若
E
大于
T->data
则跳到(
5
)
(3)
分析
T
结点的类型
(3.1)
若
T
是叶子结点则直接删除
,
树变矮即
lower=1
;
(3.2)
若
T
只有右子树
TR
则将右子树结点的值赋给
T
,删除
TR
结点将
T->rchild=NULL
,
lower=1;
(3.3)
若
T
有左子树,则找到其中序遍历的前驱结点
P
,将
P
结点值用临时变量
temp
保存,并且用指针
Tptr
保存
T
;递归删除结点
P
;将
Tptr
所指结点即原
T
结点的值更新为
temp
;
(
4
)在左子树
T->lchild
中递归删除值为
E
的结点,若删除成功检查左子树是否变矮即
lower
的值是否为
1
;若
lower=0
返回
0
退出;若
lower=1
则进行失衡调整各种情况上文有分析
(
5
)在右子树
T->rchild
中递归删除值为
E
的结点,若删除成功检查左子树是否变矮即
lower
的值是否为
1
;若
lower=0
返回
0
退出;若
lower=1
则进行失衡调整,各种情况上文有分析
大家可以很容易的实现。上文提到的平衡处理情况,很多书籍都有。