This commit is contained in:
krahets
2023-04-17 18:24:27 +08:00
parent f76b7ed47c
commit ca2ccfea0b
70 changed files with 12269 additions and 13539 deletions

View File

@@ -25,7 +25,7 @@
<title>7.2.   二叉树遍历 - Hello 算法</title>
<title>8.2.   二叉树遍历 - Hello 算法</title>
@@ -79,7 +79,7 @@
<div data-md-component="skip">
<a href="#72" class="md-skip">
<a href="#82" class="md-skip">
跳转至
</a>
@@ -113,7 +113,7 @@
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
7.2. &nbsp; 二叉树遍历
8.2. &nbsp; 二叉树遍历
</span>
</div>
@@ -441,8 +441,6 @@
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
@@ -504,23 +502,9 @@
<li class="md-nav__item">
<a href="../../chapter_computational_complexity/space_time_tradeoff/" class="md-nav__link">
2.4. &nbsp; 权衡时间与空间
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_computational_complexity/summary/" class="md-nav__link">
2.5. &nbsp; 小结
2.4. &nbsp; 小结
</a>
</li>
@@ -847,21 +831,76 @@
<label class="md-nav__link" for="__nav_7" id="__nav_7_label" tabindex="0">
6. &nbsp; &nbsp; 散列表
6. &nbsp; &nbsp; 二分查找
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_7_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_7">
<span class="md-nav__icon md-icon"></span>
6. &nbsp; &nbsp; 散列表
6. &nbsp; &nbsp; 二分查找
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter_binary_search/binary_search/" class="md-nav__link">
6.1. &nbsp; 二分查找
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" >
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
7. &nbsp; &nbsp; 散列表
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_8">
<span class="md-nav__icon md-icon"></span>
7. &nbsp; &nbsp; 散列表
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -872,7 +911,7 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/hash_map/" class="md-nav__link">
6.1. &nbsp; 哈希表
7.1. &nbsp; 哈希表
</a>
</li>
@@ -886,7 +925,7 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/hash_collision/" class="md-nav__link">
6.2. &nbsp; 哈希冲突处理
7.2. &nbsp; 哈希冲突处理
</a>
</li>
@@ -900,7 +939,7 @@
<li class="md-nav__item">
<a href="../../chapter_hashing/summary/" class="md-nav__link">
6.3. &nbsp; 小结
7.3. &nbsp; 小结
</a>
</li>
@@ -930,7 +969,7 @@
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_8" checked>
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" checked>
@@ -946,15 +985,15 @@
<label class="md-nav__link" for="__nav_8" id="__nav_8_label" tabindex="0">
7. &nbsp; &nbsp;
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
8. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_8_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_8">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
7. &nbsp; &nbsp;
8. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -965,7 +1004,7 @@
<li class="md-nav__item">
<a href="../binary_tree/" class="md-nav__link">
7.1. &nbsp; 二叉树
8.1. &nbsp; 二叉树
</a>
</li>
@@ -988,12 +1027,12 @@
<label class="md-nav__link md-nav__link--active" for="__toc">
7.2. &nbsp; 二叉树遍历
8.2. &nbsp; 二叉树遍历
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
7.2. &nbsp; 二叉树遍历
8.2. &nbsp; 二叉树遍历
</a>
@@ -1012,11 +1051,11 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#721" class="md-nav__link">
7.2.1. &nbsp; 层序遍历
<a href="#821" class="md-nav__link">
8.2.1. &nbsp; 层序遍历
</a>
<nav class="md-nav" aria-label="7.2.1. &nbsp; 层序遍历">
<nav class="md-nav" aria-label="8.2.1. &nbsp; 层序遍历">
<ul class="md-nav__list">
<li class="md-nav__item">
@@ -1039,11 +1078,11 @@
</li>
<li class="md-nav__item">
<a href="#722" class="md-nav__link">
7.2.2. &nbsp; 前序、中序、后序遍历
<a href="#822" class="md-nav__link">
8.2.2. &nbsp; 前序、中序、后序遍历
</a>
<nav class="md-nav" aria-label="7.2.2. &nbsp; 前序、中序、后序遍历">
<nav class="md-nav" aria-label="8.2.2. &nbsp; 前序、中序、后序遍历">
<ul class="md-nav__list">
<li class="md-nav__item">
@@ -1081,7 +1120,7 @@
<li class="md-nav__item">
<a href="../binary_search_tree/" class="md-nav__link">
7.3. &nbsp; 二叉搜索树
8.3. &nbsp; 二叉搜索树
</a>
</li>
@@ -1095,7 +1134,7 @@
<li class="md-nav__item">
<a href="../avl_tree/" class="md-nav__link">
7.4. &nbsp; AVL 树 *
8.4. &nbsp; AVL 树 *
</a>
</li>
@@ -1109,94 +1148,7 @@
<li class="md-nav__item">
<a href="../summary/" class="md-nav__link">
7.5. &nbsp; 小结
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_9" >
<label class="md-nav__link" for="__nav_9" id="__nav_9_label" tabindex="0">
8. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_9_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_9">
<span class="md-nav__icon md-icon"></span>
8. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter_heap/heap/" class="md-nav__link">
8.1. &nbsp;
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_heap/build_heap/" class="md-nav__link">
8.2. &nbsp; 建堆操作 *
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_heap/summary/" class="md-nav__link">
8.3. &nbsp; 小结
8.5. &nbsp; 小结
</a>
</li>
@@ -1234,19 +1186,17 @@
<label class="md-nav__link" for="__nav_10" id="__nav_10_label" tabindex="0">
9. &nbsp; &nbsp;
9. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_10_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_10">
<span class="md-nav__icon md-icon"></span>
9. &nbsp; &nbsp;
9. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -1256,8 +1206,8 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph/" class="md-nav__link">
9.1. &nbsp;
<a href="../../chapter_heap/heap/" class="md-nav__link">
9.1. &nbsp;
</a>
</li>
@@ -1270,8 +1220,8 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph_operations/" class="md-nav__link">
9.2. &nbsp; 图基础操作
<a href="../../chapter_heap/build_heap/" class="md-nav__link">
9.2. &nbsp; 建堆操作 *
</a>
</li>
@@ -1284,22 +1234,8 @@
<li class="md-nav__item">
<a href="../../chapter_graph/graph_traversal/" class="md-nav__link">
9.3. &nbsp; 图的遍历
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_graph/summary/" class="md-nav__link">
9.4. &nbsp; 小结
<a href="../../chapter_heap/summary/" class="md-nav__link">
9.3. &nbsp; 小结
</a>
</li>
@@ -1342,14 +1278,14 @@
<label class="md-nav__link" for="__nav_11" id="__nav_11_label" tabindex="0">
10. &nbsp; &nbsp; 查找算法
10. &nbsp; &nbsp;
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_11_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_11">
<span class="md-nav__icon md-icon"></span>
10. &nbsp; &nbsp; 查找算法
10. &nbsp; &nbsp;
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -1359,8 +1295,8 @@
<li class="md-nav__item">
<a href="../../chapter_searching/linear_search/" class="md-nav__link">
10.1. &nbsp; 线性查找
<a href="../../chapter_graph/graph/" class="md-nav__link">
10.1. &nbsp;
</a>
</li>
@@ -1373,8 +1309,8 @@
<li class="md-nav__item">
<a href="../../chapter_searching/binary_search/" class="md-nav__link">
10.2. &nbsp; 二分查找
<a href="../../chapter_graph/graph_operations/" class="md-nav__link">
10.2. &nbsp; 图基础操作
</a>
</li>
@@ -1387,8 +1323,8 @@
<li class="md-nav__item">
<a href="../../chapter_searching/hashing_search/" class="md-nav__link">
10.3. &nbsp; 哈希查找
<a href="../../chapter_graph/graph_traversal/" class="md-nav__link">
10.3. &nbsp; 图的遍历
</a>
</li>
@@ -1401,7 +1337,7 @@
<li class="md-nav__item">
<a href="../../chapter_searching/summary/" class="md-nav__link">
<a href="../../chapter_graph/summary/" class="md-nav__link">
10.4. &nbsp; 小结
</a>
</li>
@@ -1543,7 +1479,7 @@
<li class="md-nav__item">
<a href="../../chapter_sorting/bucket_sort/" class="md-nav__link">
11.6. &nbsp; 桶排序New
11.6. &nbsp; 桶排序
</a>
</li>
@@ -1557,7 +1493,7 @@
<li class="md-nav__item">
<a href="../../chapter_sorting/counting_sort/" class="md-nav__link">
11.7. &nbsp; 计数排序New
11.7. &nbsp; 计数排序
</a>
</li>
@@ -1571,7 +1507,7 @@
<li class="md-nav__item">
<a href="../../chapter_sorting/radix_sort/" class="md-nav__link">
11.8. &nbsp; 基数排序New
11.8. &nbsp; 基数排序
</a>
</li>
@@ -1619,17 +1555,21 @@
<label class="md-nav__link" for="__nav_13" id="__nav_13_label" tabindex="0">
12. &nbsp; &nbsp; 回溯算法
12. &nbsp; &nbsp; 搜索算法
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_13_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_13">
<span class="md-nav__icon md-icon"></span>
12. &nbsp; &nbsp; 回溯算法
12. &nbsp; &nbsp; 搜索算法
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -1639,8 +1579,36 @@
<li class="md-nav__item">
<a href="../../chapter_backtracking/backtracking_algorithm/" class="md-nav__link">
12.1. &nbsp; 回溯算法New
<a href="../../chapter_searching/searching_algorithm_revisited/" class="md-nav__link">
12.1. &nbsp; 搜索算法New
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_searching/replace_linear_by_hashing/" class="md-nav__link">
12.2. &nbsp; 哈希优化策略
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_searching/summary/" class="md-nav__link">
12.3. &nbsp; 小结
</a>
</li>
@@ -1674,19 +1642,17 @@
<label class="md-nav__link" for="__nav_14" id="__nav_14_label" tabindex="0">
13. &nbsp; &nbsp; 附录
13. &nbsp; &nbsp; 回溯算法
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_14_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_14">
<span class="md-nav__icon md-icon"></span>
13. &nbsp; &nbsp; 附录
13. &nbsp; &nbsp; 回溯算法
</label>
<ul class="md-nav__list" data-md-scrollfix>
@@ -1696,22 +1662,8 @@
<li class="md-nav__item">
<a href="../../chapter_appendix/installation/" class="md-nav__link">
13.1. &nbsp; 编程环境安装
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_appendix/contribution/" class="md-nav__link">
13.2. &nbsp; 一起参与创作
<a href="../../chapter_backtracking/backtracking_algorithm/" class="md-nav__link">
13.1. &nbsp; 回溯算法New
</a>
</li>
@@ -1744,6 +1696,77 @@
<label class="md-nav__link" for="__nav_15" id="__nav_15_label" tabindex="0">
14. &nbsp; &nbsp; 附录
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<span class="md-nav__icon md-icon"></span>
14. &nbsp; &nbsp; 附录
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../../chapter_appendix/installation/" class="md-nav__link">
14.1. &nbsp; 编程环境安装
</a>
</li>
<li class="md-nav__item">
<a href="../../chapter_appendix/contribution/" class="md-nav__link">
14.2. &nbsp; 一起参与创作
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--section md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_16" >
@@ -1756,8 +1779,8 @@
</div>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_15_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_15">
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_16_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_16">
<span class="md-nav__icon md-icon"></span>
参考文献
</label>
@@ -1798,11 +1821,11 @@
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#721" class="md-nav__link">
7.2.1. &nbsp; 层序遍历
<a href="#821" class="md-nav__link">
8.2.1. &nbsp; 层序遍历
</a>
<nav class="md-nav" aria-label="7.2.1. &nbsp; 层序遍历">
<nav class="md-nav" aria-label="8.2.1. &nbsp; 层序遍历">
<ul class="md-nav__list">
<li class="md-nav__item">
@@ -1825,11 +1848,11 @@
</li>
<li class="md-nav__item">
<a href="#722" class="md-nav__link">
7.2.2. &nbsp; 前序、中序、后序遍历
<a href="#822" class="md-nav__link">
8.2.2. &nbsp; 前序、中序、后序遍历
</a>
<nav class="md-nav" aria-label="7.2.2. &nbsp; 前序、中序、后序遍历">
<nav class="md-nav" aria-label="8.2.2. &nbsp; 前序、中序、后序遍历">
<ul class="md-nav__list">
<li class="md-nav__item">
@@ -1874,10 +1897,10 @@
<h1 id="72">7.2. &nbsp; 二叉树遍历<a class="headerlink" href="#72" title="Permanent link">&para;</a></h1>
<h1 id="82">8.2. &nbsp; 二叉树遍历<a class="headerlink" href="#82" title="Permanent link">&para;</a></h1>
<p>从物理结构的角度来看,树是一种基于链表的数据结构,因此其遍历方式是通过指针逐个访问节点。然而,树是一种非线性数据结构,这使得遍历树比遍历链表更加复杂,需要借助搜索算法来实现。</p>
<p>二叉树常见的遍历方式包括层序遍历、前序遍历、中序遍历和后序遍历等。</p>
<h2 id="721">7.2.1. &nbsp; 层序遍历<a class="headerlink" href="#721" title="Permanent link">&para;</a></h2>
<h2 id="821">8.2.1. &nbsp; 层序遍历<a class="headerlink" href="#821" title="Permanent link">&para;</a></h2>
<p>「层序遍历 Level-Order Traversal」从顶部到底部逐层遍历二叉树并在每一层按照从左到右的顺序访问节点。</p>
<p>层序遍历本质上属于「广度优先搜索 Breadth-First Traversal」它体现了一种“一圈一圈向外扩展”的逐层搜索方式。</p>
<p><img alt="二叉树的层序遍历" src="../binary_tree_traversal.assets/binary_tree_bfs.png" /></p>
@@ -2094,7 +2117,7 @@
<h3 id="_2">复杂度分析<a class="headerlink" href="#_2" title="Permanent link">&para;</a></h3>
<p><strong>时间复杂度</strong>:所有节点被访问一次,使用 <span class="arithmatex">\(O(n)\)</span> 时间,其中 <span class="arithmatex">\(n\)</span> 为节点数量。</p>
<p><strong>空间复杂度</strong>:在最差情况下,即满二叉树时,遍历到最底层之前,队列中最多同时存在 <span class="arithmatex">\(\frac{n + 1}{2}\)</span> 个节点,占用 <span class="arithmatex">\(O(n)\)</span> 空间。</p>
<h2 id="722">7.2.2. &nbsp; 前序、中序、后序遍历<a class="headerlink" href="#722" title="Permanent link">&para;</a></h2>
<h2 id="822">8.2.2. &nbsp; 前序、中序、后序遍历<a class="headerlink" href="#822" title="Permanent link">&para;</a></h2>
<p>相应地,前序、中序和后序遍历都属于「深度优先遍历 Depth-First Traversal」它体现了一种“先走到尽头再回溯继续”的遍历方式。</p>
<p>如下图所示,左侧是深度优先遍历的示意图,右上方是对应的递归实现代码。深度优先遍历就像是绕着整个二叉树的外围“走”一圈,在这个过程中,在每个节点都会遇到三个位置,分别对应前序遍历、中序遍历和后序遍历。</p>
<p><img alt="二叉搜索树的前、中、后序遍历" src="../binary_tree_traversal.assets/binary_tree_dfs.png" /></p>
@@ -2513,7 +2536,7 @@
<nav class="md-footer__inner md-grid" aria-label="页脚" >
<a href="../binary_tree/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 7.1. &amp;nbsp; 二叉树" rel="prev">
<a href="../binary_tree/" class="md-footer__link md-footer__link--prev" aria-label="上一页: 8.1. &amp;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>
@@ -2522,20 +2545,20 @@
上一页
</span>
<div class="md-ellipsis">
7.1. &nbsp; 二叉树
8.1. &nbsp; 二叉树
</div>
</div>
</a>
<a href="../binary_search_tree/" class="md-footer__link md-footer__link--next" aria-label="下一页: 7.3. &amp;nbsp; 二叉搜索树" rel="next">
<a href="../binary_search_tree/" class="md-footer__link md-footer__link--next" aria-label="下一页: 8.3. &amp;nbsp; 二叉搜索树" rel="next">
<div class="md-footer__title">
<span class="md-footer__direction">
下一页
</span>
<div class="md-ellipsis">
7.3. &nbsp; 二叉搜索树
8.3. &nbsp; 二叉搜索树
</div>
</div>
<div class="md-footer__button md-icon">