问题描述
我想知道我是否在 AVL 树上正确应用了以下插入和删除操作:
62
/ \
44 78
/ \ \
17 50 88
/ \
48 54
这就是我认为应该通过这些操作修改树的方式:
插入(42)和插入(90)
62
/ \
44 78
/ \ \
17 50 88
\ / \ \
42 48 54 90
删除(62)
78
/ \
44 88
/ \ \
17 50 90
\ / \
42 48 54
插入(92)
78
/ \
44 88
/ \ \
17 50 90
\ / \ \
42 48 54 92
删除(50)
78
/ \
44 88
/ \ \
17 54 90
\ / \
42 48 92
解决方法
有两种情况需要旋转:
___62___
/ \
__44__ 78
/ \ \
17 50 88
/ \
48 54
您正确地应用了 insert(42)
,但是 insert(90)
创建了一个不平衡的子树,其根为 78(用星号标记):它的右侧高度为 2,而其左侧为空:>
___62___
/ \
__44__ 78*
/ \ \
17 50 88
\ / \ \
42 48 54 90
所以,这不会一直这样:简单的向左旋转将向上移动 88 度,向下移动 78 度:
___62___
/ \
__44__ 88
/ \ / \
17 50 78 90
\ / \
42 48 54
您对 delete(62)
的理解是正确的:这会将根与其后继者交换,即 78,然后删除 62:
___78___
/ \
__44__ 88
/ \ \
17 50 90
\ / \
42 48 54
insert(92)
将在节点 88 处带来不平衡:
___78___
/ \
__44__ 88*
/ \ \
17 50 90
\ / \ \
42 48 54 92
因此再次应用简单的向左旋转:
___78___
/ \
__44__ 90
/ \ / \
17 50 88 92
\ / \
42 48 54
delete(50)
已正确执行。鉴于上述状态,我们得到:
___78___
/ \
__44__ 90
/ \ / \
17 54 88 92
\ /
42 48