mirror of
https://github.com/krahets/hello-algo.git
synced 2026-04-01 09:43:33 +08:00
deploy
This commit is contained in:
@@ -25,7 +25,7 @@
|
||||
|
||||
|
||||
|
||||
<title>8.4. AVL 树 * - Hello 算法</title>
|
||||
<title>8.5. AVL 树 * - Hello 算法</title>
|
||||
|
||||
|
||||
|
||||
@@ -79,7 +79,7 @@
|
||||
<div data-md-component="skip">
|
||||
|
||||
|
||||
<a href="#84-avl" class="md-skip">
|
||||
<a href="#85-avl" class="md-skip">
|
||||
跳转至
|
||||
</a>
|
||||
|
||||
@@ -113,7 +113,7 @@
|
||||
<div class="md-header__topic" data-md-component="header-topic">
|
||||
<span class="md-ellipsis">
|
||||
|
||||
8.4. AVL 树 *
|
||||
8.5. AVL 树 *
|
||||
|
||||
</span>
|
||||
</div>
|
||||
@@ -983,6 +983,8 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
|
||||
@@ -1030,9 +1032,23 @@
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../array_representation_of_tree/" class="md-nav__link">
|
||||
8.3. 二叉树数组表示
|
||||
</a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../binary_search_tree/" class="md-nav__link">
|
||||
8.3. 二叉搜索树
|
||||
8.4. 二叉搜索树
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@@ -1055,12 +1071,12 @@
|
||||
|
||||
|
||||
<label class="md-nav__link md-nav__link--active" for="__toc">
|
||||
8.4. AVL 树 *
|
||||
8.5. AVL 树 *
|
||||
<span class="md-nav__icon md-icon"></span>
|
||||
</label>
|
||||
|
||||
<a href="./" class="md-nav__link md-nav__link--active">
|
||||
8.4. AVL 树 *
|
||||
8.5. AVL 树 *
|
||||
</a>
|
||||
|
||||
|
||||
@@ -1079,11 +1095,11 @@
|
||||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#841-avl" class="md-nav__link">
|
||||
8.4.1. AVL 树常见术语
|
||||
<a href="#851-avl" class="md-nav__link">
|
||||
8.5.1. AVL 树常见术语
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="8.4.1. AVL 树常见术语">
|
||||
<nav class="md-nav" aria-label="8.5.1. AVL 树常见术语">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
@@ -1106,11 +1122,11 @@
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#842-avl" class="md-nav__link">
|
||||
8.4.2. AVL 树旋转
|
||||
<a href="#852-avl" class="md-nav__link">
|
||||
8.5.2. AVL 树旋转
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="8.4.2. AVL 树旋转">
|
||||
<nav class="md-nav" aria-label="8.5.2. AVL 树旋转">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
@@ -1154,11 +1170,11 @@
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#843-avl" class="md-nav__link">
|
||||
8.4.3. AVL 树常用操作
|
||||
<a href="#853-avl" class="md-nav__link">
|
||||
8.5.3. AVL 树常用操作
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="8.4.3. AVL 树常用操作">
|
||||
<nav class="md-nav" aria-label="8.5.3. AVL 树常用操作">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
@@ -1188,8 +1204,8 @@
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#844-avl" class="md-nav__link">
|
||||
8.4.4. AVL 树典型应用
|
||||
<a href="#854-avl" class="md-nav__link">
|
||||
8.5.4. AVL 树典型应用
|
||||
</a>
|
||||
|
||||
</li>
|
||||
@@ -1210,7 +1226,7 @@
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="../summary/" class="md-nav__link">
|
||||
8.5. 小结
|
||||
8.6. 小结
|
||||
</a>
|
||||
</li>
|
||||
|
||||
@@ -1883,11 +1899,11 @@
|
||||
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#841-avl" class="md-nav__link">
|
||||
8.4.1. AVL 树常见术语
|
||||
<a href="#851-avl" class="md-nav__link">
|
||||
8.5.1. AVL 树常见术语
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="8.4.1. AVL 树常见术语">
|
||||
<nav class="md-nav" aria-label="8.5.1. AVL 树常见术语">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
@@ -1910,11 +1926,11 @@
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#842-avl" class="md-nav__link">
|
||||
8.4.2. AVL 树旋转
|
||||
<a href="#852-avl" class="md-nav__link">
|
||||
8.5.2. AVL 树旋转
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="8.4.2. AVL 树旋转">
|
||||
<nav class="md-nav" aria-label="8.5.2. AVL 树旋转">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
@@ -1958,11 +1974,11 @@
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#843-avl" class="md-nav__link">
|
||||
8.4.3. AVL 树常用操作
|
||||
<a href="#853-avl" class="md-nav__link">
|
||||
8.5.3. AVL 树常用操作
|
||||
</a>
|
||||
|
||||
<nav class="md-nav" aria-label="8.4.3. AVL 树常用操作">
|
||||
<nav class="md-nav" aria-label="8.5.3. AVL 树常用操作">
|
||||
<ul class="md-nav__list">
|
||||
|
||||
<li class="md-nav__item">
|
||||
@@ -1992,8 +2008,8 @@
|
||||
</li>
|
||||
|
||||
<li class="md-nav__item">
|
||||
<a href="#844-avl" class="md-nav__link">
|
||||
8.4.4. AVL 树典型应用
|
||||
<a href="#854-avl" class="md-nav__link">
|
||||
8.5.4. AVL 树典型应用
|
||||
</a>
|
||||
|
||||
</li>
|
||||
@@ -2021,7 +2037,7 @@
|
||||
|
||||
|
||||
|
||||
<h1 id="84-avl">8.4. AVL 树 *<a class="headerlink" href="#84-avl" title="Permanent link">¶</a></h1>
|
||||
<h1 id="85-avl">8.5. AVL 树 *<a class="headerlink" href="#85-avl" title="Permanent link">¶</a></h1>
|
||||
<p>在二叉搜索树章节中,我们提到了在多次插入和删除操作后,二叉搜索树可能退化为链表。这种情况下,所有操作的时间复杂度将从 <span class="arithmatex">\(O(\log n)\)</span> 恶化为 <span class="arithmatex">\(O(n)\)</span>。</p>
|
||||
<p>如下图所示,经过两次删除节点操作,这个二叉搜索树便会退化为链表。</p>
|
||||
<p><img alt="AVL 树在删除节点后发生退化" src="../avl_tree.assets/avltree_degradation_from_removing_node.png" /></p>
|
||||
@@ -2032,7 +2048,7 @@
|
||||
<p align="center"> Fig. AVL 树在插入节点后发生退化 </p>
|
||||
|
||||
<p>G. M. Adelson-Velsky 和 E. M. Landis 在其 1962 年发表的论文 "An algorithm for the organization of information" 中提出了「AVL 树」。论文中详细描述了一系列操作,确保在持续添加和删除节点后,AVL 树不会退化,从而使得各种操作的时间复杂度保持在 <span class="arithmatex">\(O(\log n)\)</span> 级别。换句话说,在需要频繁进行增删查改操作的场景中,AVL 树能始终保持高效的数据操作性能,具有很好的应用价值。</p>
|
||||
<h2 id="841-avl">8.4.1. AVL 树常见术语<a class="headerlink" href="#841-avl" title="Permanent link">¶</a></h2>
|
||||
<h2 id="851-avl">8.5.1. AVL 树常见术语<a class="headerlink" href="#851-avl" title="Permanent link">¶</a></h2>
|
||||
<p>「AVL 树」既是二叉搜索树也是平衡二叉树,同时满足这两类二叉树的所有性质,因此也被称为「平衡二叉搜索树」。</p>
|
||||
<h3 id="_1">节点高度<a class="headerlink" href="#_1" title="Permanent link">¶</a></h3>
|
||||
<p>在操作 AVL 树时,我们需要获取节点的高度,因此需要为 AVL 树的节点类添加 <code>height</code> 变量。</p>
|
||||
@@ -2405,7 +2421,7 @@
|
||||
<p class="admonition-title">Note</p>
|
||||
<p>设平衡因子为 <span class="arithmatex">\(f\)</span> ,则一棵 AVL 树的任意节点的平衡因子皆满足 <span class="arithmatex">\(-1 \le f \le 1\)</span> 。</p>
|
||||
</div>
|
||||
<h2 id="842-avl">8.4.2. AVL 树旋转<a class="headerlink" href="#842-avl" title="Permanent link">¶</a></h2>
|
||||
<h2 id="852-avl">8.5.2. AVL 树旋转<a class="headerlink" href="#852-avl" title="Permanent link">¶</a></h2>
|
||||
<p>AVL 树的特点在于「旋转 Rotation」操作,它能够在不影响二叉树的中序遍历序列的前提下,使失衡节点重新恢复平衡。换句话说,<strong>旋转操作既能保持树的「二叉搜索树」属性,也能使树重新变为「平衡二叉树」</strong>。</p>
|
||||
<p>我们将平衡因子绝对值 <span class="arithmatex">\(> 1\)</span> 的节点称为「失衡节点」。根据节点失衡情况的不同,旋转操作分为四种:右旋、左旋、先右旋后左旋、先左旋后右旋。下面我们将详细介绍这些旋转操作。</p>
|
||||
<h3 id="_3">右旋<a class="headerlink" href="#_3" title="Permanent link">¶</a></h3>
|
||||
@@ -3096,7 +3112,7 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<h2 id="843-avl">8.4.3. AVL 树常用操作<a class="headerlink" href="#843-avl" title="Permanent link">¶</a></h2>
|
||||
<h2 id="853-avl">8.5.3. AVL 树常用操作<a class="headerlink" href="#853-avl" title="Permanent link">¶</a></h2>
|
||||
<h3 id="_8">插入节点<a class="headerlink" href="#_8" title="Permanent link">¶</a></h3>
|
||||
<p>「AVL 树」的节点插入操作与「二叉搜索树」在主体上类似。唯一的区别在于,在 AVL 树中插入节点后,从该节点到根节点的路径上可能会出现一系列失衡节点。因此,<strong>我们需要从这个节点开始,自底向上执行旋转操作,使所有失衡节点恢复平衡</strong>。</p>
|
||||
<div class="tabbed-set tabbed-alternate" data-tabs="8:10"><input checked="checked" id="__tabbed_8_1" name="__tabbed_8" type="radio" /><input id="__tabbed_8_2" name="__tabbed_8" type="radio" /><input id="__tabbed_8_3" name="__tabbed_8" type="radio" /><input id="__tabbed_8_4" name="__tabbed_8" type="radio" /><input id="__tabbed_8_5" name="__tabbed_8" type="radio" /><input id="__tabbed_8_6" name="__tabbed_8" type="radio" /><input id="__tabbed_8_7" name="__tabbed_8" type="radio" /><input id="__tabbed_8_8" name="__tabbed_8" type="radio" /><input id="__tabbed_8_9" name="__tabbed_8" type="radio" /><input id="__tabbed_8_10" name="__tabbed_8" type="radio" /><div class="tabbed-labels"><label for="__tabbed_8_1">Java</label><label for="__tabbed_8_2">C++</label><label for="__tabbed_8_3">Python</label><label for="__tabbed_8_4">Go</label><label for="__tabbed_8_5">JavaScript</label><label for="__tabbed_8_6">TypeScript</label><label for="__tabbed_8_7">C</label><label for="__tabbed_8_8">C#</label><label for="__tabbed_8_9">Swift</label><label for="__tabbed_8_10">Zig</label></div>
|
||||
@@ -3746,7 +3762,7 @@
|
||||
</div>
|
||||
<h3 id="_10">查找节点<a class="headerlink" href="#_10" title="Permanent link">¶</a></h3>
|
||||
<p>AVL 树的节点查找操作与二叉搜索树一致,在此不再赘述。</p>
|
||||
<h2 id="844-avl">8.4.4. AVL 树典型应用<a class="headerlink" href="#844-avl" title="Permanent link">¶</a></h2>
|
||||
<h2 id="854-avl">8.5.4. AVL 树典型应用<a class="headerlink" href="#854-avl" title="Permanent link">¶</a></h2>
|
||||
<ul>
|
||||
<li>组织和存储大型数据,适用于高频查找、低频增删的场景;</li>
|
||||
<li>用于构建数据库中的索引系统;</li>
|
||||
@@ -3832,7 +3848,7 @@
|
||||
<nav class="md-footer__inner md-grid" aria-label="页脚" >
|
||||
|
||||
|
||||
<a href="../binary_search_tree/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 8.3. &nbsp; 二叉搜索树" rel="prev">
|
||||
<a href="../binary_search_tree/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 8.4. &nbsp; 二叉搜索树" rel="prev">
|
||||
<div class="md-footer__button md-icon">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
|
||||
</div>
|
||||
@@ -3841,20 +3857,20 @@
|
||||
上一页
|
||||
</span>
|
||||
<div class="md-ellipsis">
|
||||
8.3. 二叉搜索树
|
||||
8.4. 二叉搜索树
|
||||
</div>
|
||||
</div>
|
||||
</a>
|
||||
|
||||
|
||||
|
||||
<a href="../summary/" class="md-footer__link md-footer__link--next" aria-label="下一页: 8.5. &nbsp; 小结" rel="next">
|
||||
<a href="../summary/" class="md-footer__link md-footer__link--next" aria-label="下一页: 8.6. &nbsp; 小结" rel="next">
|
||||
<div class="md-footer__title">
|
||||
<span class="md-footer__direction">
|
||||
下一页
|
||||
</span>
|
||||
<div class="md-ellipsis">
|
||||
8.5. 小结
|
||||
8.6. 小结
|
||||
</div>
|
||||
</div>
|
||||
<div class="md-footer__button md-icon">
|
||||
|
||||
Reference in New Issue
Block a user