Update avltree.md
This commit is contained in:
parent
47dd285100
commit
cacbbe59e2
@ -211,7 +211,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影
|
||||
|
||||
### Case 1 - 右旋
|
||||
|
||||
如下图所示(结点下方为「平衡因子」),从底至顶看,二叉树中首个失衡结点是 **结点 2** 。我们聚焦在以结点 2 为根结点的子树上,将该结点记为 `node` ,将其左子节点记为 `child` ,执行「右旋」操作。完成右旋后,该子树已经恢复平衡,并且仍然为二叉搜索树。
|
||||
如下图所示(结点下方为「平衡因子」),从底至顶看,二叉树中首个失衡结点是 **结点 3** 。我们聚焦在以该失衡结点为根结点的子树上,将该结点记为 `node` ,将其左子节点记为 `child` ,执行「右旋」操作。完成右旋后,该子树已经恢复平衡,并且仍然为二叉搜索树。
|
||||
|
||||
=== "Step 1"
|
||||
![right_rotate_step1](avl_tree.assets/right_rotate_step1.png)
|
||||
@ -290,10 +290,12 @@ AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影
|
||||
|
||||
### Case 2 - 左旋
|
||||
|
||||
类似地,如果将取上述失衡二叉树的 “镜像” ,那么则需要「左旋」操作。观察发现,**「左旋」和「右旋」操作是镜像对称的,两者对应解决的两种失衡情况也是对称的**,这说明两种旋转操作本质上是一样的。
|
||||
类似地,如果将取上述失衡二叉树的 “镜像” ,那么则需要「左旋」操作。观察发现,**「左旋」和「右旋」操作是镜像对称的,两者对应解决的两种失衡情况也是对称的**。
|
||||
|
||||
![left_rotate_with_grandchild](avl_tree.assets/left_rotate_with_grandchild.png)
|
||||
|
||||
根据对称性,我们可以很方便地从「右旋」推导出「左旋」。具体地,把所有的 `left` 替换为 `right` 、所有的 `right` 替换为 `left` 即可。
|
||||
|
||||
=== "Java"
|
||||
|
||||
```java title="avl_tree.java"
|
||||
@ -368,7 +370,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影
|
||||
|
||||
### 旋转的选择
|
||||
|
||||
下图总结了以上四种失衡情况,分别采用右旋、左旋、先右后左、先左后右的旋转组合。
|
||||
下图描述的四种失衡情况与上述 Cases 一一对应,分别采用右旋、左旋、先右后左、先左后右的旋转组合。
|
||||
|
||||
![rotation_cases](avl_tree.assets/rotation_cases.png)
|
||||
|
||||
@ -385,7 +387,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影
|
||||
|
||||
</div>
|
||||
|
||||
下面,将旋转操作封装成一个函数。至此,**我们可以通过此函数来处理所有类型的失衡结点,使之恢复平衡**。
|
||||
根据以上规则,我们将旋转操作封装成一个函数。至此,**我们可以使用此函数来旋转各种失衡情况,使失衡结点重新恢复平衡**。
|
||||
|
||||
=== "Java"
|
||||
|
||||
@ -467,7 +469,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影
|
||||
|
||||
### 插入结点
|
||||
|
||||
「AVL 树」的结点插入操作与「二叉搜索树」主体类似。不同的是,在插入结点后,从该结点到根结点的路径上会出现「失衡结点」。所以,**我们需要从该结点开始,从底至顶地执行旋转操作,使所有失衡结点恢复平衡**。
|
||||
「AVL 树」的结点插入操作与「二叉搜索树」主体类似。不同的是,在插入结点后,从该结点到根结点的路径上会出现一系列「失衡结点」。所以,**我们需要从该结点开始,从底至顶地执行旋转操作,使所有失衡结点恢复平衡**。
|
||||
|
||||
=== "Java"
|
||||
|
||||
@ -638,3 +640,11 @@ AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影
|
||||
### 查找结点
|
||||
|
||||
「AVL 树」的结点查找操作与「二叉搜索树」一致,在此不再赘述。
|
||||
|
||||
## AVL 树典型应用
|
||||
|
||||
- 组织存储大型数据,适用于高频查找、低频增删场景
|
||||
- 用于建立数据库中的索引系统;
|
||||
|
||||
!!! question "为什么红黑树比 AVL 树更受欢迎?"
|
||||
红黑树的平衡条件相对宽松,因此在红黑树中插入与删除结点所需的旋转操作相对更少,结点增删操作相比 AVL 树的效率更高。
|
||||
|
@ -3,4 +3,3 @@ comments: true
|
||||
---
|
||||
|
||||
# 小结
|
||||
|
||||
|
@ -57,16 +57,3 @@
|
||||
display: block;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
/* navigation scrollbar */
|
||||
.md-sidebar__scrollwrap {
|
||||
overflow-y: hidden;
|
||||
}
|
||||
|
||||
.md-sidebar__scrollwrap:hover {
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
/* .md-sidebar__scrollwrap::-webkit-scrollbar-thumb {
|
||||
background-color: var(--md-default-fg-color--lightest);
|
||||
} */
|
Loading…
Reference in New Issue
Block a user