mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-08 13:36:06 +00:00
deploy
This commit is contained in:
@@ -1820,16 +1820,16 @@
|
||||
|
||||
|
||||
<h1 id="72">7.2. 二叉树遍历<a class="headerlink" href="#72" title="Permanent link">¶</a></h1>
|
||||
<p>从物理结构角度看,树是一种基于链表的数据结构,因此遍历方式也是通过指针(即引用)逐个遍历节点。同时,树还是一种非线性数据结构,这导致遍历树比遍历链表更加复杂,需要使用搜索算法来实现。</p>
|
||||
<p>常见的二叉树遍历方式有层序遍历、前序遍历、中序遍历、后序遍历。</p>
|
||||
<p>从物理结构的角度来看,树是一种基于链表的数据结构,因此其遍历方式是通过指针逐个访问节点。然而,树是一种非线性数据结构,这使得遍历树比遍历链表更加复杂,需要借助搜索算法来实现。</p>
|
||||
<p>二叉树常见的遍历方式包括层序遍历、前序遍历、中序遍历和后序遍历等。</p>
|
||||
<h2 id="721">7.2.1. 层序遍历<a class="headerlink" href="#721" title="Permanent link">¶</a></h2>
|
||||
<p>「层序遍历 Level-Order Traversal」从顶至底、一层一层地遍历二叉树,并在每层中按照从左到右的顺序访问节点。</p>
|
||||
<p>层序遍历本质上是「广度优先搜索 Breadth-First Traversal」,其体现着一种“一圈一圈向外”的层进遍历方式。</p>
|
||||
<p>「层序遍历 Level-Order Traversal」从顶部到底部逐层遍历二叉树,并在每一层按照从左到右的顺序访问节点。</p>
|
||||
<p>层序遍历本质上属于「广度优先搜索 Breadth-First Traversal」,它体现了一种“一圈一圈向外扩展”的逐层搜索方式。</p>
|
||||
<p><img alt="二叉树的层序遍历" src="../binary_tree_traversal.assets/binary_tree_bfs.png" /></p>
|
||||
<p align="center"> Fig. 二叉树的层序遍历 </p>
|
||||
|
||||
<h3 id="_1">算法实现<a class="headerlink" href="#_1" title="Permanent link">¶</a></h3>
|
||||
<p>广度优先遍历一般借助「队列」来实现。队列的规则是“先进先出”,广度优先遍历的规则是“一层层平推”,两者背后的思想是一致的。</p>
|
||||
<p>广度优先遍历通常借助「队列」来实现。队列遵循“先进先出”的规则,而广度优先遍历则遵循“逐层推进”的规则,两者背后的思想是一致的。</p>
|
||||
<div class="tabbed-set tabbed-alternate" data-tabs="1:10"><input checked="checked" id="__tabbed_1_1" name="__tabbed_1" type="radio" /><input id="__tabbed_1_2" name="__tabbed_1" type="radio" /><input id="__tabbed_1_3" name="__tabbed_1" type="radio" /><input id="__tabbed_1_4" name="__tabbed_1" type="radio" /><input id="__tabbed_1_5" name="__tabbed_1" type="radio" /><input id="__tabbed_1_6" name="__tabbed_1" type="radio" /><input id="__tabbed_1_7" name="__tabbed_1" type="radio" /><input id="__tabbed_1_8" name="__tabbed_1" type="radio" /><input id="__tabbed_1_9" name="__tabbed_1" type="radio" /><input id="__tabbed_1_10" name="__tabbed_1" type="radio" /><div class="tabbed-labels"><label for="__tabbed_1_1">Java</label><label for="__tabbed_1_2">C++</label><label for="__tabbed_1_3">Python</label><label for="__tabbed_1_4">Go</label><label for="__tabbed_1_5">JavaScript</label><label for="__tabbed_1_6">TypeScript</label><label for="__tabbed_1_7">C</label><label for="__tabbed_1_8">C#</label><label for="__tabbed_1_9">Swift</label><label for="__tabbed_1_10">Zig</label></div>
|
||||
<div class="tabbed-content">
|
||||
<div class="tabbed-block">
|
||||
@@ -2038,10 +2038,10 @@
|
||||
</div>
|
||||
<h3 id="_2">复杂度分析<a class="headerlink" href="#_2" title="Permanent link">¶</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>
|
||||
<p><strong>空间复杂度</strong>:在最差情况下,即满二叉树时,遍历到最底层之前,队列中最多同时存在 <span class="arithmatex">\(\frac{n + 1}{2}\)</span> 个节点,占用 <span class="arithmatex">\(O(n)\)</span> 空间。</p>
|
||||
<h2 id="722">7.2.2. 前序、中序、后序遍历<a class="headerlink" href="#722" title="Permanent link">¶</a></h2>
|
||||
<p>相对地,前、中、后序遍历皆属于「深度优先遍历 Depth-First Traversal」,其体现着一种“先走到尽头,再回头继续”的回溯遍历方式。</p>
|
||||
<p>如下图所示,左侧是深度优先遍历的的示意图,右上方是对应的递归实现代码。深度优先遍历就像是绕着整个二叉树的外围“走”一圈,走的过程中,在每个节点都会遇到三个位置,分别对应前序遍历、中序遍历、后序遍历。</p>
|
||||
<p>相应地,前序、中序和后序遍历都属于「深度优先遍历 Depth-First Traversal」,它体现了一种“先走到尽头,再回溯继续”的遍历方式。</p>
|
||||
<p>如下图所示,左侧是深度优先遍历的示意图,右上方是对应的递归实现代码。深度优先遍历就像是绕着整个二叉树的外围“走”一圈,在这个过程中,在每个节点都会遇到三个位置,分别对应前序遍历、中序遍历和后序遍历。</p>
|
||||
<p><img alt="二叉搜索树的前、中、后序遍历" src="../binary_tree_traversal.assets/binary_tree_dfs.png" /></p>
|
||||
<p align="center"> Fig. 二叉搜索树的前、中、后序遍历 </p>
|
||||
|
||||
@@ -2374,7 +2374,7 @@
|
||||
</div>
|
||||
<h3 id="_4">复杂度分析<a class="headerlink" href="#_4" title="Permanent link">¶</a></h3>
|
||||
<p><strong>时间复杂度</strong>:所有节点被访问一次,使用 <span class="arithmatex">\(O(n)\)</span> 时间,其中 <span class="arithmatex">\(n\)</span> 为节点数量。</p>
|
||||
<p><strong>空间复杂度</strong>:当树退化为链表时达到最差情况,递归深度达到 <span class="arithmatex">\(n\)</span> ,系统使用 <span class="arithmatex">\(O(n)\)</span> 栈帧空间。</p>
|
||||
<p><strong>空间复杂度</strong>:在最差情况下,即树退化为链表时,递归深度达到 <span class="arithmatex">\(n\)</span> ,系统占用 <span class="arithmatex">\(O(n)\)</span> 栈帧空间。</p>
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user