Update avltree.md

pull/88/head
Yudong Jin 2 years ago
parent 47dd285100
commit cacbbe59e2

@ -1,4 +1,4 @@
mkdocs build mkdocs build --clean
cd site cd site
git init git init
git add -A git add -A

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

@ -3,4 +3,3 @@ comments: true
--- ---
# 小结 # 小结

@ -57,16 +57,3 @@
display: block; display: block;
margin: 0 auto; 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…
Cancel
Save