From cacbbe59e247ca827bf17c5f1bfc85909bbd3650 Mon Sep 17 00:00:00 2001 From: Yudong Jin Date: Sun, 11 Dec 2022 18:41:15 +0800 Subject: [PATCH] Update avltree.md --- deploy.sh | 2 +- docs/chapter_tree/avl_tree.md | 20 +++++++++++++++----- docs/chapter_tree/summary.md | 1 - docs/stylesheets/extra.css | 13 ------------- 4 files changed, 16 insertions(+), 20 deletions(-) diff --git a/deploy.sh b/deploy.sh index c77fcac..eea0186 100644 --- a/deploy.sh +++ b/deploy.sh @@ -1,4 +1,4 @@ -mkdocs build +mkdocs build --clean cd site git init git add -A diff --git a/docs/chapter_tree/avl_tree.md b/docs/chapter_tree/avl_tree.md index 73eafda..d42c3ad 100644 --- a/docs/chapter_tree/avl_tree.md +++ b/docs/chapter_tree/avl_tree.md @@ -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」的操作,其可 **在不影 -下面,将旋转操作封装成一个函数。至此,**我们可以通过此函数来处理所有类型的失衡结点,使之恢复平衡**。 +根据以上规则,我们将旋转操作封装成一个函数。至此,**我们可以使用此函数来旋转各种失衡情况,使失衡结点重新恢复平衡**。 === "Java" @@ -467,7 +469,7 @@ AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影 ### 插入结点 -「AVL 树」的结点插入操作与「二叉搜索树」主体类似。不同的是,在插入结点后,从该结点到根结点的路径上会出现「失衡结点」。所以,**我们需要从该结点开始,从底至顶地执行旋转操作,使所有失衡结点恢复平衡**。 +「AVL 树」的结点插入操作与「二叉搜索树」主体类似。不同的是,在插入结点后,从该结点到根结点的路径上会出现一系列「失衡结点」。所以,**我们需要从该结点开始,从底至顶地执行旋转操作,使所有失衡结点恢复平衡**。 === "Java" @@ -638,3 +640,11 @@ AVL 树的独特之处在于「旋转 Rotation」的操作,其可 **在不影 ### 查找结点 「AVL 树」的结点查找操作与「二叉搜索树」一致,在此不再赘述。 + +## AVL 树典型应用 + +- 组织存储大型数据,适用于高频查找、低频增删场景 +- 用于建立数据库中的索引系统; + +!!! question "为什么红黑树比 AVL 树更受欢迎?" + 红黑树的平衡条件相对宽松,因此在红黑树中插入与删除结点所需的旋转操作相对更少,结点增删操作相比 AVL 树的效率更高。 diff --git a/docs/chapter_tree/summary.md b/docs/chapter_tree/summary.md index df0b7a7..5f58b75 100644 --- a/docs/chapter_tree/summary.md +++ b/docs/chapter_tree/summary.md @@ -3,4 +3,3 @@ comments: true --- # 小结 - diff --git a/docs/stylesheets/extra.css b/docs/stylesheets/extra.css index 6160895..bb2bde3 100644 --- a/docs/stylesheets/extra.css +++ b/docs/stylesheets/extra.css @@ -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); -} */ \ No newline at end of file