This commit is contained in:
krahets
2023-06-25 21:11:44 +08:00
parent 0b6f239630
commit 5a61bb028f
22 changed files with 1067 additions and 207 deletions

View File

@@ -1179,10 +1179,41 @@
<label class="md-nav__link md-nav__link--active" for="__toc">
7.6. &nbsp; 小结
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
7.6. &nbsp; 小结
</a>
<nav class="md-nav md-nav--secondary" aria-label="目录">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目录
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#761-q-a" class="md-nav__link">
7.6.1. &nbsp; Q &amp; A
</a>
</li>
</ul>
</nav>
</li>
@@ -2051,6 +2082,21 @@
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
目录
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#761-q-a" class="md-nav__link">
7.6.1. &nbsp; Q &amp; A
</a>
</li>
</ul>
</nav>
</div>
</div>
@@ -2086,6 +2132,27 @@
<li>AVL 树,也称为平衡二叉搜索树,它通过旋转操作,确保在不断插入和删除节点后,树仍然保持平衡。</li>
<li>AVL 树的旋转操作包括右旋、左旋、先右旋再左旋、先左旋再右旋。在插入或删除节点后AVL 树会从底向顶执行旋转操作,使树重新恢复平衡。</li>
</ul>
<h2 id="761-q-a">7.6.1. &nbsp; Q &amp; A<a class="headerlink" href="#761-q-a" title="Permanent link">&para;</a></h2>
<div class="admonition question">
<p class="admonition-title">对于只有一个节点的二叉树,树的高度和根节点的深度都是 <span class="arithmatex">\(0\)</span> 吗?</p>
<p>是的,因为高度和深度通常定义为“走过边的数量”。</p>
</div>
<div class="admonition question">
<p class="admonition-title">二叉树中的插入与删除一般都是由一套操作配合完成的,这里的“一套操作”指什么呢?可以理解为资源的子节点的资源释放吗?</p>
<p>拿二叉搜索树来举例,删除节点操作要分为三种情况处理,其中每种情况都需要进行多个步骤的节点操作。</p>
</div>
<div class="admonition question">
<p class="admonition-title">为什么 DFS 遍历二叉树有前、中、后三种顺序,分别有什么用呢?</p>
<p>DFS 的前、中、后序遍历和访问数组的顺序类似,是遍历二叉树的基本方法,利用这三种遍历方法,我们可以得到一个特定顺序的遍历结果。例如在二叉搜索树中,由于结点大小满足 <code>左子结点值 &lt; 根结点值 &lt; 右子结点值</code> ,因此我们只要按照 <code>左-&gt;根-&gt;</code> 的优先级遍历树,就可以获得有序的节点序列。</p>
</div>
<div class="admonition question">
<p class="admonition-title">右旋操作是处理失衡节点 <code>node</code> , <code>child</code> , <code>grand_child</code> 之间的关系,那 <code>node</code> 的父节点和 <code>node</code> 原来的连接不需要维护吗?右旋操作后岂不是断掉了?</p>
<p>我们需要从递归的视角来看这个问题。右旋操作 <code>right_rotate(root)</code> 传入的是子树的根节点,最终 <code>return child</code> 返回旋转之后的子树的根节点。子树的根节点和其父节点的连接是在该函数返回后完成的,不属于右旋操作的维护范围。</p>
</div>
<div class="admonition question">
<p class="admonition-title">在 C++ 中,函数被划分到 <code>private</code><code>public</code> 中,这方面有什么考量吗?为什么要将 <code>height()</code> 函数和 <code>updateHeight()</code> 函数分别放在 <code>public</code><code>private</code> 中呢?</p>
<p>主要看方法的使用范围,如果方法只在类内部使用,那么就设计为 <code>private</code> 。例如,用户单独调用 <code>updateHeight()</code> 是没有意义的,它只是插入、删除操作中的一步。而 <code>height()</code> 是访问结点高度,类似于 <code>vector.size()</code> ,因此设置成 <code>public</code> 以便使用。</p>
</div>