mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-17 11:32:10 +08:00
deploy
This commit is contained in:
@@ -3849,7 +3849,99 @@
|
||||
</code></pre></div>
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
<div class="highlight"><span class="filename">array_binary_tree.swift</span><pre><span></span><code><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="p">[</span><span class="kd">class</span><span class="p">]{</span><span class="n">ArrayBinaryTree</span><span class="p">}</span><span class="o">-</span><span class="p">[</span><span class="kd">func</span><span class="p">]{}</span>
|
||||
<div class="highlight"><span class="filename">array_binary_tree.swift</span><pre><span></span><code><a id="__codelineno-19-1" name="__codelineno-19-1" href="#__codelineno-19-1"></a><span class="cm">/* 数组表示下的二叉树类 */</span>
|
||||
<a id="__codelineno-19-2" name="__codelineno-19-2" href="#__codelineno-19-2"></a><span class="kd">class</span> <span class="nc">ArrayBinaryTree</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-3" name="__codelineno-19-3" href="#__codelineno-19-3"></a> <span class="kd">private</span> <span class="kd">var</span> <span class="nv">tree</span><span class="p">:</span> <span class="p">[</span><span class="nb">Int</span><span class="p">?]</span>
|
||||
<a id="__codelineno-19-4" name="__codelineno-19-4" href="#__codelineno-19-4"></a>
|
||||
<a id="__codelineno-19-5" name="__codelineno-19-5" href="#__codelineno-19-5"></a> <span class="cm">/* 构造方法 */</span>
|
||||
<a id="__codelineno-19-6" name="__codelineno-19-6" href="#__codelineno-19-6"></a> <span class="kd">init</span><span class="p">(</span><span class="n">arr</span><span class="p">:</span> <span class="p">[</span><span class="nb">Int</span><span class="p">?])</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-7" name="__codelineno-19-7" href="#__codelineno-19-7"></a> <span class="n">tree</span> <span class="p">=</span> <span class="n">arr</span>
|
||||
<a id="__codelineno-19-8" name="__codelineno-19-8" href="#__codelineno-19-8"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-9" name="__codelineno-19-9" href="#__codelineno-19-9"></a>
|
||||
<a id="__codelineno-19-10" name="__codelineno-19-10" href="#__codelineno-19-10"></a> <span class="cm">/* 节点数量 */</span>
|
||||
<a id="__codelineno-19-11" name="__codelineno-19-11" href="#__codelineno-19-11"></a> <span class="kd">func</span> <span class="nf">size</span><span class="p">()</span> <span class="p">-></span> <span class="nb">Int</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-12" name="__codelineno-19-12" href="#__codelineno-19-12"></a> <span class="n">tree</span><span class="p">.</span><span class="bp">count</span>
|
||||
<a id="__codelineno-19-13" name="__codelineno-19-13" href="#__codelineno-19-13"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-14" name="__codelineno-19-14" href="#__codelineno-19-14"></a>
|
||||
<a id="__codelineno-19-15" name="__codelineno-19-15" href="#__codelineno-19-15"></a> <span class="cm">/* 获取索引为 i 节点的值 */</span>
|
||||
<a id="__codelineno-19-16" name="__codelineno-19-16" href="#__codelineno-19-16"></a> <span class="kd">func</span> <span class="nf">val</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">-></span> <span class="nb">Int</span><span class="p">?</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-17" name="__codelineno-19-17" href="#__codelineno-19-17"></a> <span class="c1">// 若索引越界,则返回 null ,代表空位</span>
|
||||
<a id="__codelineno-19-18" name="__codelineno-19-18" href="#__codelineno-19-18"></a> <span class="k">if</span> <span class="n">i</span> <span class="o"><</span> <span class="mi">0</span> <span class="o">||</span> <span class="n">i</span> <span class="o">>=</span> <span class="n">size</span><span class="p">()</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-19" name="__codelineno-19-19" href="#__codelineno-19-19"></a> <span class="k">return</span> <span class="kc">nil</span>
|
||||
<a id="__codelineno-19-20" name="__codelineno-19-20" href="#__codelineno-19-20"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-21" name="__codelineno-19-21" href="#__codelineno-19-21"></a> <span class="k">return</span> <span class="n">tree</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
|
||||
<a id="__codelineno-19-22" name="__codelineno-19-22" href="#__codelineno-19-22"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-23" name="__codelineno-19-23" href="#__codelineno-19-23"></a>
|
||||
<a id="__codelineno-19-24" name="__codelineno-19-24" href="#__codelineno-19-24"></a> <span class="cm">/* 获取索引为 i 节点的左子节点的索引 */</span>
|
||||
<a id="__codelineno-19-25" name="__codelineno-19-25" href="#__codelineno-19-25"></a> <span class="kd">func</span> <span class="nf">left</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">-></span> <span class="nb">Int</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-26" name="__codelineno-19-26" href="#__codelineno-19-26"></a> <span class="mi">2</span> <span class="o">*</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span>
|
||||
<a id="__codelineno-19-27" name="__codelineno-19-27" href="#__codelineno-19-27"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-28" name="__codelineno-19-28" href="#__codelineno-19-28"></a>
|
||||
<a id="__codelineno-19-29" name="__codelineno-19-29" href="#__codelineno-19-29"></a> <span class="cm">/* 获取索引为 i 节点的右子节点的索引 */</span>
|
||||
<a id="__codelineno-19-30" name="__codelineno-19-30" href="#__codelineno-19-30"></a> <span class="kd">func</span> <span class="nf">right</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">-></span> <span class="nb">Int</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-31" name="__codelineno-19-31" href="#__codelineno-19-31"></a> <span class="mi">2</span> <span class="o">*</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">2</span>
|
||||
<a id="__codelineno-19-32" name="__codelineno-19-32" href="#__codelineno-19-32"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-33" name="__codelineno-19-33" href="#__codelineno-19-33"></a>
|
||||
<a id="__codelineno-19-34" name="__codelineno-19-34" href="#__codelineno-19-34"></a> <span class="cm">/* 获取索引为 i 节点的父节点的索引 */</span>
|
||||
<a id="__codelineno-19-35" name="__codelineno-19-35" href="#__codelineno-19-35"></a> <span class="kd">func</span> <span class="nf">parent</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">-></span> <span class="nb">Int</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-36" name="__codelineno-19-36" href="#__codelineno-19-36"></a> <span class="p">(</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span>
|
||||
<a id="__codelineno-19-37" name="__codelineno-19-37" href="#__codelineno-19-37"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-38" name="__codelineno-19-38" href="#__codelineno-19-38"></a>
|
||||
<a id="__codelineno-19-39" name="__codelineno-19-39" href="#__codelineno-19-39"></a> <span class="cm">/* 层序遍历 */</span>
|
||||
<a id="__codelineno-19-40" name="__codelineno-19-40" href="#__codelineno-19-40"></a> <span class="kd">func</span> <span class="nf">levelOrder</span><span class="p">()</span> <span class="p">-></span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-41" name="__codelineno-19-41" href="#__codelineno-19-41"></a> <span class="kd">var</span> <span class="nv">res</span><span class="p">:</span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">=</span> <span class="p">[]</span>
|
||||
<a id="__codelineno-19-42" name="__codelineno-19-42" href="#__codelineno-19-42"></a> <span class="c1">// 直接遍历数组</span>
|
||||
<a id="__codelineno-19-43" name="__codelineno-19-43" href="#__codelineno-19-43"></a> <span class="k">for</span> <span class="n">i</span> <span class="k">in</span> <span class="bp">stride</span><span class="p">(</span><span class="n">from</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">to</span><span class="p">:</span> <span class="n">size</span><span class="p">(),</span> <span class="n">by</span><span class="p">:</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-44" name="__codelineno-19-44" href="#__codelineno-19-44"></a> <span class="k">if</span> <span class="kd">let</span> <span class="nv">val</span> <span class="p">=</span> <span class="n">val</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="n">i</span><span class="p">)</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-45" name="__codelineno-19-45" href="#__codelineno-19-45"></a> <span class="n">res</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-19-46" name="__codelineno-19-46" href="#__codelineno-19-46"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-47" name="__codelineno-19-47" href="#__codelineno-19-47"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-48" name="__codelineno-19-48" href="#__codelineno-19-48"></a> <span class="k">return</span> <span class="n">res</span>
|
||||
<a id="__codelineno-19-49" name="__codelineno-19-49" href="#__codelineno-19-49"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-50" name="__codelineno-19-50" href="#__codelineno-19-50"></a>
|
||||
<a id="__codelineno-19-51" name="__codelineno-19-51" href="#__codelineno-19-51"></a> <span class="cm">/* 深度优先遍历 */</span>
|
||||
<a id="__codelineno-19-52" name="__codelineno-19-52" href="#__codelineno-19-52"></a> <span class="kd">private</span> <span class="kd">func</span> <span class="nf">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="nb">Int</span><span class="p">,</span> <span class="n">order</span><span class="p">:</span> <span class="nb">String</span><span class="p">,</span> <span class="n">res</span><span class="p">:</span> <span class="kr">inout</span> <span class="p">[</span><span class="nb">Int</span><span class="p">])</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-53" name="__codelineno-19-53" href="#__codelineno-19-53"></a> <span class="c1">// 若为空位,则返回</span>
|
||||
<a id="__codelineno-19-54" name="__codelineno-19-54" href="#__codelineno-19-54"></a> <span class="k">guard</span> <span class="kd">let</span> <span class="nv">val</span> <span class="p">=</span> <span class="n">val</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="n">i</span><span class="p">)</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-55" name="__codelineno-19-55" href="#__codelineno-19-55"></a> <span class="k">return</span>
|
||||
<a id="__codelineno-19-56" name="__codelineno-19-56" href="#__codelineno-19-56"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-57" name="__codelineno-19-57" href="#__codelineno-19-57"></a> <span class="c1">// 前序遍历</span>
|
||||
<a id="__codelineno-19-58" name="__codelineno-19-58" href="#__codelineno-19-58"></a> <span class="k">if</span> <span class="n">order</span> <span class="p">==</span> <span class="s">"pre"</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-59" name="__codelineno-19-59" href="#__codelineno-19-59"></a> <span class="n">res</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-19-60" name="__codelineno-19-60" href="#__codelineno-19-60"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-61" name="__codelineno-19-61" href="#__codelineno-19-61"></a> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="kr">left</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="n">i</span><span class="p">),</span> <span class="n">order</span><span class="p">:</span> <span class="n">order</span><span class="p">,</span> <span class="n">res</span><span class="p">:</span> <span class="p">&</span><span class="n">res</span><span class="p">)</span>
|
||||
<a id="__codelineno-19-62" name="__codelineno-19-62" href="#__codelineno-19-62"></a> <span class="c1">// 中序遍历</span>
|
||||
<a id="__codelineno-19-63" name="__codelineno-19-63" href="#__codelineno-19-63"></a> <span class="k">if</span> <span class="n">order</span> <span class="p">==</span> <span class="s">"in"</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-64" name="__codelineno-19-64" href="#__codelineno-19-64"></a> <span class="n">res</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-19-65" name="__codelineno-19-65" href="#__codelineno-19-65"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-66" name="__codelineno-19-66" href="#__codelineno-19-66"></a> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="kr">right</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="n">i</span><span class="p">),</span> <span class="n">order</span><span class="p">:</span> <span class="n">order</span><span class="p">,</span> <span class="n">res</span><span class="p">:</span> <span class="p">&</span><span class="n">res</span><span class="p">)</span>
|
||||
<a id="__codelineno-19-67" name="__codelineno-19-67" href="#__codelineno-19-67"></a> <span class="c1">// 后序遍历</span>
|
||||
<a id="__codelineno-19-68" name="__codelineno-19-68" href="#__codelineno-19-68"></a> <span class="k">if</span> <span class="n">order</span> <span class="p">==</span> <span class="s">"post"</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-69" name="__codelineno-19-69" href="#__codelineno-19-69"></a> <span class="n">res</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-19-70" name="__codelineno-19-70" href="#__codelineno-19-70"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-71" name="__codelineno-19-71" href="#__codelineno-19-71"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-72" name="__codelineno-19-72" href="#__codelineno-19-72"></a>
|
||||
<a id="__codelineno-19-73" name="__codelineno-19-73" href="#__codelineno-19-73"></a> <span class="cm">/* 前序遍历 */</span>
|
||||
<a id="__codelineno-19-74" name="__codelineno-19-74" href="#__codelineno-19-74"></a> <span class="kd">func</span> <span class="nf">preOrder</span><span class="p">()</span> <span class="p">-></span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-75" name="__codelineno-19-75" href="#__codelineno-19-75"></a> <span class="kd">var</span> <span class="nv">res</span><span class="p">:</span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">=</span> <span class="p">[]</span>
|
||||
<a id="__codelineno-19-76" name="__codelineno-19-76" href="#__codelineno-19-76"></a> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">order</span><span class="p">:</span> <span class="s">"pre"</span><span class="p">,</span> <span class="n">res</span><span class="p">:</span> <span class="p">&</span><span class="n">res</span><span class="p">)</span>
|
||||
<a id="__codelineno-19-77" name="__codelineno-19-77" href="#__codelineno-19-77"></a> <span class="k">return</span> <span class="n">res</span>
|
||||
<a id="__codelineno-19-78" name="__codelineno-19-78" href="#__codelineno-19-78"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-79" name="__codelineno-19-79" href="#__codelineno-19-79"></a>
|
||||
<a id="__codelineno-19-80" name="__codelineno-19-80" href="#__codelineno-19-80"></a> <span class="cm">/* 中序遍历 */</span>
|
||||
<a id="__codelineno-19-81" name="__codelineno-19-81" href="#__codelineno-19-81"></a> <span class="kd">func</span> <span class="nf">inOrder</span><span class="p">()</span> <span class="p">-></span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-82" name="__codelineno-19-82" href="#__codelineno-19-82"></a> <span class="kd">var</span> <span class="nv">res</span><span class="p">:</span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">=</span> <span class="p">[]</span>
|
||||
<a id="__codelineno-19-83" name="__codelineno-19-83" href="#__codelineno-19-83"></a> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">order</span><span class="p">:</span> <span class="s">"in"</span><span class="p">,</span> <span class="n">res</span><span class="p">:</span> <span class="p">&</span><span class="n">res</span><span class="p">)</span>
|
||||
<a id="__codelineno-19-84" name="__codelineno-19-84" href="#__codelineno-19-84"></a> <span class="k">return</span> <span class="n">res</span>
|
||||
<a id="__codelineno-19-85" name="__codelineno-19-85" href="#__codelineno-19-85"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-86" name="__codelineno-19-86" href="#__codelineno-19-86"></a>
|
||||
<a id="__codelineno-19-87" name="__codelineno-19-87" href="#__codelineno-19-87"></a> <span class="cm">/* 后序遍历 */</span>
|
||||
<a id="__codelineno-19-88" name="__codelineno-19-88" href="#__codelineno-19-88"></a> <span class="kd">func</span> <span class="nf">postOrder</span><span class="p">()</span> <span class="p">-></span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">{</span>
|
||||
<a id="__codelineno-19-89" name="__codelineno-19-89" href="#__codelineno-19-89"></a> <span class="kd">var</span> <span class="nv">res</span><span class="p">:</span> <span class="p">[</span><span class="nb">Int</span><span class="p">]</span> <span class="p">=</span> <span class="p">[]</span>
|
||||
<a id="__codelineno-19-90" name="__codelineno-19-90" href="#__codelineno-19-90"></a> <span class="n">dfs</span><span class="p">(</span><span class="n">i</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="n">order</span><span class="p">:</span> <span class="s">"post"</span><span class="p">,</span> <span class="n">res</span><span class="p">:</span> <span class="p">&</span><span class="n">res</span><span class="p">)</span>
|
||||
<a id="__codelineno-19-91" name="__codelineno-19-91" href="#__codelineno-19-91"></a> <span class="k">return</span> <span class="n">res</span>
|
||||
<a id="__codelineno-19-92" name="__codelineno-19-92" href="#__codelineno-19-92"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-19-93" name="__codelineno-19-93" href="#__codelineno-19-93"></a><span class="p">}</span>
|
||||
</code></pre></div>
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
|
||||
@@ -5048,31 +5048,30 @@
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
<div class="highlight"><span class="filename">avl_tree.swift</span><pre><span></span><code><a id="__codelineno-74-1" name="__codelineno-74-1" href="#__codelineno-74-1"></a><span class="cm">/* 插入节点 */</span>
|
||||
<a id="__codelineno-74-2" name="__codelineno-74-2" href="#__codelineno-74-2"></a><span class="p">@</span><span class="n">discardableResult</span>
|
||||
<a id="__codelineno-74-3" name="__codelineno-74-3" href="#__codelineno-74-3"></a><span class="kd">func</span> <span class="nf">insert</span><span class="p">(</span><span class="n">val</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-4" name="__codelineno-74-4" href="#__codelineno-74-4"></a> <span class="n">root</span> <span class="p">=</span> <span class="n">insertHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">root</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-74-5" name="__codelineno-74-5" href="#__codelineno-74-5"></a><span class="p">}</span>
|
||||
<a id="__codelineno-74-6" name="__codelineno-74-6" href="#__codelineno-74-6"></a>
|
||||
<a id="__codelineno-74-7" name="__codelineno-74-7" href="#__codelineno-74-7"></a><span class="cm">/* 递归插入节点(辅助方法) */</span>
|
||||
<a id="__codelineno-74-8" name="__codelineno-74-8" href="#__codelineno-74-8"></a><span class="kd">func</span> <span class="nf">insertHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">?,</span> <span class="n">val</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">-></span> <span class="n">TreeNode</span><span class="p">?</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-9" name="__codelineno-74-9" href="#__codelineno-74-9"></a> <span class="kd">var</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">node</span>
|
||||
<a id="__codelineno-74-10" name="__codelineno-74-10" href="#__codelineno-74-10"></a> <span class="k">if</span> <span class="n">node</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-11" name="__codelineno-74-11" href="#__codelineno-74-11"></a> <span class="k">return</span> <span class="n">TreeNode</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-74-12" name="__codelineno-74-12" href="#__codelineno-74-12"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-74-13" name="__codelineno-74-13" href="#__codelineno-74-13"></a> <span class="cm">/* 1. 查找插入位置,并插入节点 */</span>
|
||||
<a id="__codelineno-74-14" name="__codelineno-74-14" href="#__codelineno-74-14"></a> <span class="k">if</span> <span class="n">val</span> <span class="o"><</span> <span class="n">node</span><span class="p">!.</span><span class="n">val</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-15" name="__codelineno-74-15" href="#__codelineno-74-15"></a> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span> <span class="p">=</span> <span class="n">insertHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-74-16" name="__codelineno-74-16" href="#__codelineno-74-16"></a> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="n">val</span> <span class="o">></span> <span class="n">node</span><span class="p">!.</span><span class="n">val</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-17" name="__codelineno-74-17" href="#__codelineno-74-17"></a> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span> <span class="p">=</span> <span class="n">insertHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-74-18" name="__codelineno-74-18" href="#__codelineno-74-18"></a> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-19" name="__codelineno-74-19" href="#__codelineno-74-19"></a> <span class="k">return</span> <span class="n">node</span> <span class="c1">// 重复节点不插入,直接返回</span>
|
||||
<a id="__codelineno-74-20" name="__codelineno-74-20" href="#__codelineno-74-20"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-74-21" name="__codelineno-74-21" href="#__codelineno-74-21"></a> <span class="n">updateHeight</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">)</span> <span class="c1">// 更新节点高度</span>
|
||||
<a id="__codelineno-74-22" name="__codelineno-74-22" href="#__codelineno-74-22"></a> <span class="cm">/* 2. 执行旋转操作,使该子树重新恢复平衡 */</span>
|
||||
<a id="__codelineno-74-23" name="__codelineno-74-23" href="#__codelineno-74-23"></a> <span class="n">node</span> <span class="p">=</span> <span class="n">rotate</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">)</span>
|
||||
<a id="__codelineno-74-24" name="__codelineno-74-24" href="#__codelineno-74-24"></a> <span class="c1">// 返回子树的根节点</span>
|
||||
<a id="__codelineno-74-25" name="__codelineno-74-25" href="#__codelineno-74-25"></a> <span class="k">return</span> <span class="n">node</span>
|
||||
<a id="__codelineno-74-26" name="__codelineno-74-26" href="#__codelineno-74-26"></a><span class="p">}</span>
|
||||
<a id="__codelineno-74-2" name="__codelineno-74-2" href="#__codelineno-74-2"></a><span class="kd">func</span> <span class="nf">insert</span><span class="p">(</span><span class="n">val</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-3" name="__codelineno-74-3" href="#__codelineno-74-3"></a> <span class="n">root</span> <span class="p">=</span> <span class="n">insertHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">root</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-74-4" name="__codelineno-74-4" href="#__codelineno-74-4"></a><span class="p">}</span>
|
||||
<a id="__codelineno-74-5" name="__codelineno-74-5" href="#__codelineno-74-5"></a>
|
||||
<a id="__codelineno-74-6" name="__codelineno-74-6" href="#__codelineno-74-6"></a><span class="cm">/* 递归插入节点(辅助方法) */</span>
|
||||
<a id="__codelineno-74-7" name="__codelineno-74-7" href="#__codelineno-74-7"></a><span class="kd">func</span> <span class="nf">insertHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">?,</span> <span class="n">val</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">-></span> <span class="n">TreeNode</span><span class="p">?</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-8" name="__codelineno-74-8" href="#__codelineno-74-8"></a> <span class="kd">var</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">node</span>
|
||||
<a id="__codelineno-74-9" name="__codelineno-74-9" href="#__codelineno-74-9"></a> <span class="k">if</span> <span class="n">node</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-10" name="__codelineno-74-10" href="#__codelineno-74-10"></a> <span class="k">return</span> <span class="n">TreeNode</span><span class="p">(</span><span class="n">x</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-74-11" name="__codelineno-74-11" href="#__codelineno-74-11"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-74-12" name="__codelineno-74-12" href="#__codelineno-74-12"></a> <span class="cm">/* 1. 查找插入位置,并插入节点 */</span>
|
||||
<a id="__codelineno-74-13" name="__codelineno-74-13" href="#__codelineno-74-13"></a> <span class="k">if</span> <span class="n">val</span> <span class="o"><</span> <span class="n">node</span><span class="p">!.</span><span class="n">val</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-14" name="__codelineno-74-14" href="#__codelineno-74-14"></a> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span> <span class="p">=</span> <span class="n">insertHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-74-15" name="__codelineno-74-15" href="#__codelineno-74-15"></a> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="n">val</span> <span class="o">></span> <span class="n">node</span><span class="p">!.</span><span class="n">val</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-16" name="__codelineno-74-16" href="#__codelineno-74-16"></a> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span> <span class="p">=</span> <span class="n">insertHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-74-17" name="__codelineno-74-17" href="#__codelineno-74-17"></a> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-74-18" name="__codelineno-74-18" href="#__codelineno-74-18"></a> <span class="k">return</span> <span class="n">node</span> <span class="c1">// 重复节点不插入,直接返回</span>
|
||||
<a id="__codelineno-74-19" name="__codelineno-74-19" href="#__codelineno-74-19"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-74-20" name="__codelineno-74-20" href="#__codelineno-74-20"></a> <span class="n">updateHeight</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">)</span> <span class="c1">// 更新节点高度</span>
|
||||
<a id="__codelineno-74-21" name="__codelineno-74-21" href="#__codelineno-74-21"></a> <span class="cm">/* 2. 执行旋转操作,使该子树重新恢复平衡 */</span>
|
||||
<a id="__codelineno-74-22" name="__codelineno-74-22" href="#__codelineno-74-22"></a> <span class="n">node</span> <span class="p">=</span> <span class="n">rotate</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">)</span>
|
||||
<a id="__codelineno-74-23" name="__codelineno-74-23" href="#__codelineno-74-23"></a> <span class="c1">// 返回子树的根节点</span>
|
||||
<a id="__codelineno-74-24" name="__codelineno-74-24" href="#__codelineno-74-24"></a> <span class="k">return</span> <span class="n">node</span>
|
||||
<a id="__codelineno-74-25" name="__codelineno-74-25" href="#__codelineno-74-25"></a><span class="p">}</span>
|
||||
</code></pre></div>
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
@@ -5482,49 +5481,48 @@
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
<div class="highlight"><span class="filename">avl_tree.swift</span><pre><span></span><code><a id="__codelineno-85-1" name="__codelineno-85-1" href="#__codelineno-85-1"></a><span class="cm">/* 删除节点 */</span>
|
||||
<a id="__codelineno-85-2" name="__codelineno-85-2" href="#__codelineno-85-2"></a><span class="p">@</span><span class="n">discardableResult</span>
|
||||
<a id="__codelineno-85-3" name="__codelineno-85-3" href="#__codelineno-85-3"></a><span class="kd">func</span> <span class="nf">remove</span><span class="p">(</span><span class="n">val</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-4" name="__codelineno-85-4" href="#__codelineno-85-4"></a> <span class="n">root</span> <span class="p">=</span> <span class="n">removeHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">root</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-85-5" name="__codelineno-85-5" href="#__codelineno-85-5"></a><span class="p">}</span>
|
||||
<a id="__codelineno-85-6" name="__codelineno-85-6" href="#__codelineno-85-6"></a>
|
||||
<a id="__codelineno-85-7" name="__codelineno-85-7" href="#__codelineno-85-7"></a><span class="cm">/* 递归删除节点(辅助方法) */</span>
|
||||
<a id="__codelineno-85-8" name="__codelineno-85-8" href="#__codelineno-85-8"></a><span class="kd">func</span> <span class="nf">removeHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">?,</span> <span class="n">val</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">-></span> <span class="n">TreeNode</span><span class="p">?</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-9" name="__codelineno-85-9" href="#__codelineno-85-9"></a> <span class="kd">var</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">node</span>
|
||||
<a id="__codelineno-85-10" name="__codelineno-85-10" href="#__codelineno-85-10"></a> <span class="k">if</span> <span class="n">node</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-11" name="__codelineno-85-11" href="#__codelineno-85-11"></a> <span class="k">return</span> <span class="kc">nil</span>
|
||||
<a id="__codelineno-85-12" name="__codelineno-85-12" href="#__codelineno-85-12"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-13" name="__codelineno-85-13" href="#__codelineno-85-13"></a> <span class="cm">/* 1. 查找节点,并删除之 */</span>
|
||||
<a id="__codelineno-85-14" name="__codelineno-85-14" href="#__codelineno-85-14"></a> <span class="k">if</span> <span class="n">val</span> <span class="o"><</span> <span class="n">node</span><span class="p">!.</span><span class="n">val</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-15" name="__codelineno-85-15" href="#__codelineno-85-15"></a> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span> <span class="p">=</span> <span class="n">removeHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-85-16" name="__codelineno-85-16" href="#__codelineno-85-16"></a> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="n">val</span> <span class="o">></span> <span class="n">node</span><span class="p">!.</span><span class="n">val</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-17" name="__codelineno-85-17" href="#__codelineno-85-17"></a> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span> <span class="p">=</span> <span class="n">removeHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-85-18" name="__codelineno-85-18" href="#__codelineno-85-18"></a> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-19" name="__codelineno-85-19" href="#__codelineno-85-19"></a> <span class="k">if</span> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span> <span class="p">==</span> <span class="kc">nil</span> <span class="o">||</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-20" name="__codelineno-85-20" href="#__codelineno-85-20"></a> <span class="kd">let</span> <span class="nv">child</span> <span class="p">=</span> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">?</span> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span> <span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span>
|
||||
<a id="__codelineno-85-21" name="__codelineno-85-21" href="#__codelineno-85-21"></a> <span class="c1">// 子节点数量 = 0 ,直接删除 node 并返回</span>
|
||||
<a id="__codelineno-85-22" name="__codelineno-85-22" href="#__codelineno-85-22"></a> <span class="k">if</span> <span class="n">child</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-23" name="__codelineno-85-23" href="#__codelineno-85-23"></a> <span class="k">return</span> <span class="kc">nil</span>
|
||||
<a id="__codelineno-85-24" name="__codelineno-85-24" href="#__codelineno-85-24"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-25" name="__codelineno-85-25" href="#__codelineno-85-25"></a> <span class="c1">// 子节点数量 = 1 ,直接删除 node</span>
|
||||
<a id="__codelineno-85-26" name="__codelineno-85-26" href="#__codelineno-85-26"></a> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-27" name="__codelineno-85-27" href="#__codelineno-85-27"></a> <span class="n">node</span> <span class="p">=</span> <span class="n">child</span>
|
||||
<a id="__codelineno-85-28" name="__codelineno-85-28" href="#__codelineno-85-28"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-29" name="__codelineno-85-29" href="#__codelineno-85-29"></a> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-30" name="__codelineno-85-30" href="#__codelineno-85-30"></a> <span class="c1">// 子节点数量 = 2 ,则将中序遍历的下个节点删除,并用该节点替换当前节点</span>
|
||||
<a id="__codelineno-85-31" name="__codelineno-85-31" href="#__codelineno-85-31"></a> <span class="kd">var</span> <span class="nv">temp</span> <span class="p">=</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span>
|
||||
<a id="__codelineno-85-32" name="__codelineno-85-32" href="#__codelineno-85-32"></a> <span class="k">while</span> <span class="n">temp</span><span class="p">?.</span><span class="kr">left</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-33" name="__codelineno-85-33" href="#__codelineno-85-33"></a> <span class="n">temp</span> <span class="p">=</span> <span class="n">temp</span><span class="p">?.</span><span class="kr">left</span>
|
||||
<a id="__codelineno-85-34" name="__codelineno-85-34" href="#__codelineno-85-34"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-35" name="__codelineno-85-35" href="#__codelineno-85-35"></a> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span> <span class="p">=</span> <span class="n">removeHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">temp</span><span class="p">!.</span><span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-85-36" name="__codelineno-85-36" href="#__codelineno-85-36"></a> <span class="n">node</span><span class="p">?.</span><span class="n">val</span> <span class="p">=</span> <span class="n">temp</span><span class="p">!.</span><span class="n">val</span>
|
||||
<a id="__codelineno-85-37" name="__codelineno-85-37" href="#__codelineno-85-37"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-38" name="__codelineno-85-38" href="#__codelineno-85-38"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-39" name="__codelineno-85-39" href="#__codelineno-85-39"></a> <span class="n">updateHeight</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">)</span> <span class="c1">// 更新节点高度</span>
|
||||
<a id="__codelineno-85-40" name="__codelineno-85-40" href="#__codelineno-85-40"></a> <span class="cm">/* 2. 执行旋转操作,使该子树重新恢复平衡 */</span>
|
||||
<a id="__codelineno-85-41" name="__codelineno-85-41" href="#__codelineno-85-41"></a> <span class="n">node</span> <span class="p">=</span> <span class="n">rotate</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">)</span>
|
||||
<a id="__codelineno-85-42" name="__codelineno-85-42" href="#__codelineno-85-42"></a> <span class="c1">// 返回子树的根节点</span>
|
||||
<a id="__codelineno-85-43" name="__codelineno-85-43" href="#__codelineno-85-43"></a> <span class="k">return</span> <span class="n">node</span>
|
||||
<a id="__codelineno-85-44" name="__codelineno-85-44" href="#__codelineno-85-44"></a><span class="p">}</span>
|
||||
<a id="__codelineno-85-2" name="__codelineno-85-2" href="#__codelineno-85-2"></a><span class="kd">func</span> <span class="nf">remove</span><span class="p">(</span><span class="n">val</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-3" name="__codelineno-85-3" href="#__codelineno-85-3"></a> <span class="n">root</span> <span class="p">=</span> <span class="n">removeHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">root</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-85-4" name="__codelineno-85-4" href="#__codelineno-85-4"></a><span class="p">}</span>
|
||||
<a id="__codelineno-85-5" name="__codelineno-85-5" href="#__codelineno-85-5"></a>
|
||||
<a id="__codelineno-85-6" name="__codelineno-85-6" href="#__codelineno-85-6"></a><span class="cm">/* 递归删除节点(辅助方法) */</span>
|
||||
<a id="__codelineno-85-7" name="__codelineno-85-7" href="#__codelineno-85-7"></a><span class="kd">func</span> <span class="nf">removeHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">?,</span> <span class="n">val</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">-></span> <span class="n">TreeNode</span><span class="p">?</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-8" name="__codelineno-85-8" href="#__codelineno-85-8"></a> <span class="kd">var</span> <span class="nv">node</span> <span class="p">=</span> <span class="n">node</span>
|
||||
<a id="__codelineno-85-9" name="__codelineno-85-9" href="#__codelineno-85-9"></a> <span class="k">if</span> <span class="n">node</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-10" name="__codelineno-85-10" href="#__codelineno-85-10"></a> <span class="k">return</span> <span class="kc">nil</span>
|
||||
<a id="__codelineno-85-11" name="__codelineno-85-11" href="#__codelineno-85-11"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-12" name="__codelineno-85-12" href="#__codelineno-85-12"></a> <span class="cm">/* 1. 查找节点,并删除之 */</span>
|
||||
<a id="__codelineno-85-13" name="__codelineno-85-13" href="#__codelineno-85-13"></a> <span class="k">if</span> <span class="n">val</span> <span class="o"><</span> <span class="n">node</span><span class="p">!.</span><span class="n">val</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-14" name="__codelineno-85-14" href="#__codelineno-85-14"></a> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span> <span class="p">=</span> <span class="n">removeHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-85-15" name="__codelineno-85-15" href="#__codelineno-85-15"></a> <span class="p">}</span> <span class="k">else</span> <span class="k">if</span> <span class="n">val</span> <span class="o">></span> <span class="n">node</span><span class="p">!.</span><span class="n">val</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-16" name="__codelineno-85-16" href="#__codelineno-85-16"></a> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span> <span class="p">=</span> <span class="n">removeHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-85-17" name="__codelineno-85-17" href="#__codelineno-85-17"></a> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-18" name="__codelineno-85-18" href="#__codelineno-85-18"></a> <span class="k">if</span> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span> <span class="p">==</span> <span class="kc">nil</span> <span class="o">||</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-19" name="__codelineno-85-19" href="#__codelineno-85-19"></a> <span class="kd">let</span> <span class="nv">child</span> <span class="p">=</span> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">?</span> <span class="n">node</span><span class="p">?.</span><span class="kr">left</span> <span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span>
|
||||
<a id="__codelineno-85-20" name="__codelineno-85-20" href="#__codelineno-85-20"></a> <span class="c1">// 子节点数量 = 0 ,直接删除 node 并返回</span>
|
||||
<a id="__codelineno-85-21" name="__codelineno-85-21" href="#__codelineno-85-21"></a> <span class="k">if</span> <span class="n">child</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-22" name="__codelineno-85-22" href="#__codelineno-85-22"></a> <span class="k">return</span> <span class="kc">nil</span>
|
||||
<a id="__codelineno-85-23" name="__codelineno-85-23" href="#__codelineno-85-23"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-24" name="__codelineno-85-24" href="#__codelineno-85-24"></a> <span class="c1">// 子节点数量 = 1 ,直接删除 node</span>
|
||||
<a id="__codelineno-85-25" name="__codelineno-85-25" href="#__codelineno-85-25"></a> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-26" name="__codelineno-85-26" href="#__codelineno-85-26"></a> <span class="n">node</span> <span class="p">=</span> <span class="n">child</span>
|
||||
<a id="__codelineno-85-27" name="__codelineno-85-27" href="#__codelineno-85-27"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-28" name="__codelineno-85-28" href="#__codelineno-85-28"></a> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-29" name="__codelineno-85-29" href="#__codelineno-85-29"></a> <span class="c1">// 子节点数量 = 2 ,则将中序遍历的下个节点删除,并用该节点替换当前节点</span>
|
||||
<a id="__codelineno-85-30" name="__codelineno-85-30" href="#__codelineno-85-30"></a> <span class="kd">var</span> <span class="nv">temp</span> <span class="p">=</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span>
|
||||
<a id="__codelineno-85-31" name="__codelineno-85-31" href="#__codelineno-85-31"></a> <span class="k">while</span> <span class="n">temp</span><span class="p">?.</span><span class="kr">left</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-85-32" name="__codelineno-85-32" href="#__codelineno-85-32"></a> <span class="n">temp</span> <span class="p">=</span> <span class="n">temp</span><span class="p">?.</span><span class="kr">left</span>
|
||||
<a id="__codelineno-85-33" name="__codelineno-85-33" href="#__codelineno-85-33"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-34" name="__codelineno-85-34" href="#__codelineno-85-34"></a> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span> <span class="p">=</span> <span class="n">removeHelper</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">?.</span><span class="kr">right</span><span class="p">,</span> <span class="n">val</span><span class="p">:</span> <span class="n">temp</span><span class="p">!.</span><span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-85-35" name="__codelineno-85-35" href="#__codelineno-85-35"></a> <span class="n">node</span><span class="p">?.</span><span class="n">val</span> <span class="p">=</span> <span class="n">temp</span><span class="p">!.</span><span class="n">val</span>
|
||||
<a id="__codelineno-85-36" name="__codelineno-85-36" href="#__codelineno-85-36"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-37" name="__codelineno-85-37" href="#__codelineno-85-37"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-85-38" name="__codelineno-85-38" href="#__codelineno-85-38"></a> <span class="n">updateHeight</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">)</span> <span class="c1">// 更新节点高度</span>
|
||||
<a id="__codelineno-85-39" name="__codelineno-85-39" href="#__codelineno-85-39"></a> <span class="cm">/* 2. 执行旋转操作,使该子树重新恢复平衡 */</span>
|
||||
<a id="__codelineno-85-40" name="__codelineno-85-40" href="#__codelineno-85-40"></a> <span class="n">node</span> <span class="p">=</span> <span class="n">rotate</span><span class="p">(</span><span class="n">node</span><span class="p">:</span> <span class="n">node</span><span class="p">)</span>
|
||||
<a id="__codelineno-85-41" name="__codelineno-85-41" href="#__codelineno-85-41"></a> <span class="c1">// 返回子树的根节点</span>
|
||||
<a id="__codelineno-85-42" name="__codelineno-85-42" href="#__codelineno-85-42"></a> <span class="k">return</span> <span class="n">node</span>
|
||||
<a id="__codelineno-85-43" name="__codelineno-85-43" href="#__codelineno-85-43"></a><span class="p">}</span>
|
||||
</code></pre></div>
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
|
||||
@@ -4495,63 +4495,62 @@
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
<div class="highlight"><span class="filename">binary_search_tree.swift</span><pre><span></span><code><a id="__codelineno-30-1" name="__codelineno-30-1" href="#__codelineno-30-1"></a><span class="cm">/* 删除节点 */</span>
|
||||
<a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a><span class="p">@</span><span class="n">discardableResult</span>
|
||||
<a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a><span class="kd">func</span> <span class="nf">remove</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-4"></a> <span class="c1">// 若树为空,直接提前返回</span>
|
||||
<a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-5"></a> <span class="k">if</span> <span class="n">root</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-6" name="__codelineno-30-6" href="#__codelineno-30-6"></a> <span class="k">return</span>
|
||||
<a id="__codelineno-30-7" name="__codelineno-30-7" href="#__codelineno-30-7"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-8" name="__codelineno-30-8" href="#__codelineno-30-8"></a> <span class="kd">var</span> <span class="nv">cur</span> <span class="p">=</span> <span class="n">root</span>
|
||||
<a id="__codelineno-30-9" name="__codelineno-30-9" href="#__codelineno-30-9"></a> <span class="kd">var</span> <span class="nv">pre</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">?</span>
|
||||
<a id="__codelineno-30-10" name="__codelineno-30-10" href="#__codelineno-30-10"></a> <span class="c1">// 循环查找,越过叶节点后跳出</span>
|
||||
<a id="__codelineno-30-11" name="__codelineno-30-11" href="#__codelineno-30-11"></a> <span class="k">while</span> <span class="n">cur</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-12" name="__codelineno-30-12" href="#__codelineno-30-12"></a> <span class="c1">// 找到待删除节点,跳出循环</span>
|
||||
<a id="__codelineno-30-13" name="__codelineno-30-13" href="#__codelineno-30-13"></a> <span class="k">if</span> <span class="n">cur</span><span class="p">!.</span><span class="n">val</span> <span class="p">==</span> <span class="n">num</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-14" name="__codelineno-30-14" href="#__codelineno-30-14"></a> <span class="k">break</span>
|
||||
<a id="__codelineno-30-15" name="__codelineno-30-15" href="#__codelineno-30-15"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-16" name="__codelineno-30-16" href="#__codelineno-30-16"></a> <span class="n">pre</span> <span class="p">=</span> <span class="n">cur</span>
|
||||
<a id="__codelineno-30-17" name="__codelineno-30-17" href="#__codelineno-30-17"></a> <span class="c1">// 待删除节点在 cur 的右子树中</span>
|
||||
<a id="__codelineno-30-18" name="__codelineno-30-18" href="#__codelineno-30-18"></a> <span class="k">if</span> <span class="n">cur</span><span class="p">!.</span><span class="n">val</span> <span class="o"><</span> <span class="n">num</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-19" name="__codelineno-30-19" href="#__codelineno-30-19"></a> <span class="n">cur</span> <span class="p">=</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">right</span>
|
||||
<a id="__codelineno-30-20" name="__codelineno-30-20" href="#__codelineno-30-20"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-21" name="__codelineno-30-21" href="#__codelineno-30-21"></a> <span class="c1">// 待删除节点在 cur 的左子树中</span>
|
||||
<a id="__codelineno-30-22" name="__codelineno-30-22" href="#__codelineno-30-22"></a> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-23" name="__codelineno-30-23" href="#__codelineno-30-23"></a> <span class="n">cur</span> <span class="p">=</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">left</span>
|
||||
<a id="__codelineno-30-24" name="__codelineno-30-24" href="#__codelineno-30-24"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-25" name="__codelineno-30-25" href="#__codelineno-30-25"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-26" name="__codelineno-30-26" href="#__codelineno-30-26"></a> <span class="c1">// 若无待删除节点,则直接返回</span>
|
||||
<a id="__codelineno-30-27" name="__codelineno-30-27" href="#__codelineno-30-27"></a> <span class="k">if</span> <span class="n">cur</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-28" name="__codelineno-30-28" href="#__codelineno-30-28"></a> <span class="k">return</span>
|
||||
<a id="__codelineno-30-29" name="__codelineno-30-29" href="#__codelineno-30-29"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-30" name="__codelineno-30-30" href="#__codelineno-30-30"></a> <span class="c1">// 子节点数量 = 0 or 1</span>
|
||||
<a id="__codelineno-30-31" name="__codelineno-30-31" href="#__codelineno-30-31"></a> <span class="k">if</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">left</span> <span class="p">==</span> <span class="kc">nil</span> <span class="o">||</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">right</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-32" name="__codelineno-30-32" href="#__codelineno-30-32"></a> <span class="c1">// 当子节点数量 = 0 / 1 时, child = null / 该子节点</span>
|
||||
<a id="__codelineno-30-33" name="__codelineno-30-33" href="#__codelineno-30-33"></a> <span class="kd">let</span> <span class="nv">child</span> <span class="p">=</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">left</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">?</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">left</span> <span class="p">:</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">right</span>
|
||||
<a id="__codelineno-30-34" name="__codelineno-30-34" href="#__codelineno-30-34"></a> <span class="c1">// 删除节点 cur</span>
|
||||
<a id="__codelineno-30-35" name="__codelineno-30-35" href="#__codelineno-30-35"></a> <span class="k">if</span> <span class="n">cur</span> <span class="o">!==</span> <span class="n">root</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-36" name="__codelineno-30-36" href="#__codelineno-30-36"></a> <span class="k">if</span> <span class="n">pre</span><span class="p">?.</span><span class="kr">left</span> <span class="p">===</span> <span class="n">cur</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-37" name="__codelineno-30-37" href="#__codelineno-30-37"></a> <span class="n">pre</span><span class="p">?.</span><span class="kr">left</span> <span class="p">=</span> <span class="n">child</span>
|
||||
<a id="__codelineno-30-38" name="__codelineno-30-38" href="#__codelineno-30-38"></a> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-39" name="__codelineno-30-39" href="#__codelineno-30-39"></a> <span class="n">pre</span><span class="p">?.</span><span class="kr">right</span> <span class="p">=</span> <span class="n">child</span>
|
||||
<a id="__codelineno-30-40" name="__codelineno-30-40" href="#__codelineno-30-40"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-41" name="__codelineno-30-41" href="#__codelineno-30-41"></a> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-42" name="__codelineno-30-42" href="#__codelineno-30-42"></a> <span class="c1">// 若删除节点为根节点,则重新指定根节点</span>
|
||||
<a id="__codelineno-30-43" name="__codelineno-30-43" href="#__codelineno-30-43"></a> <span class="n">root</span> <span class="p">=</span> <span class="n">child</span>
|
||||
<a id="__codelineno-30-44" name="__codelineno-30-44" href="#__codelineno-30-44"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-45" name="__codelineno-30-45" href="#__codelineno-30-45"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-46" name="__codelineno-30-46" href="#__codelineno-30-46"></a> <span class="c1">// 子节点数量 = 2</span>
|
||||
<a id="__codelineno-30-47" name="__codelineno-30-47" href="#__codelineno-30-47"></a> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-48" name="__codelineno-30-48" href="#__codelineno-30-48"></a> <span class="c1">// 获取中序遍历中 cur 的下一个节点</span>
|
||||
<a id="__codelineno-30-49" name="__codelineno-30-49" href="#__codelineno-30-49"></a> <span class="kd">var</span> <span class="nv">tmp</span> <span class="p">=</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">right</span>
|
||||
<a id="__codelineno-30-50" name="__codelineno-30-50" href="#__codelineno-30-50"></a> <span class="k">while</span> <span class="n">tmp</span><span class="p">?.</span><span class="kr">left</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-51" name="__codelineno-30-51" href="#__codelineno-30-51"></a> <span class="n">tmp</span> <span class="p">=</span> <span class="n">tmp</span><span class="p">?.</span><span class="kr">left</span>
|
||||
<a id="__codelineno-30-52" name="__codelineno-30-52" href="#__codelineno-30-52"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-53" name="__codelineno-30-53" href="#__codelineno-30-53"></a> <span class="c1">// 递归删除节点 tmp</span>
|
||||
<a id="__codelineno-30-54" name="__codelineno-30-54" href="#__codelineno-30-54"></a> <span class="n">remove</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="n">tmp</span><span class="p">!.</span><span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-30-55" name="__codelineno-30-55" href="#__codelineno-30-55"></a> <span class="c1">// 用 tmp 覆盖 cur</span>
|
||||
<a id="__codelineno-30-56" name="__codelineno-30-56" href="#__codelineno-30-56"></a> <span class="n">cur</span><span class="p">?.</span><span class="n">val</span> <span class="p">=</span> <span class="n">tmp</span><span class="p">!.</span><span class="n">val</span>
|
||||
<a id="__codelineno-30-57" name="__codelineno-30-57" href="#__codelineno-30-57"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-58" name="__codelineno-30-58" href="#__codelineno-30-58"></a><span class="p">}</span>
|
||||
<a id="__codelineno-30-2" name="__codelineno-30-2" href="#__codelineno-30-2"></a><span class="kd">func</span> <span class="nf">remove</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="nb">Int</span><span class="p">)</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-3" name="__codelineno-30-3" href="#__codelineno-30-3"></a> <span class="c1">// 若树为空,直接提前返回</span>
|
||||
<a id="__codelineno-30-4" name="__codelineno-30-4" href="#__codelineno-30-4"></a> <span class="k">if</span> <span class="n">root</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-5" name="__codelineno-30-5" href="#__codelineno-30-5"></a> <span class="k">return</span>
|
||||
<a id="__codelineno-30-6" name="__codelineno-30-6" href="#__codelineno-30-6"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-7" name="__codelineno-30-7" href="#__codelineno-30-7"></a> <span class="kd">var</span> <span class="nv">cur</span> <span class="p">=</span> <span class="n">root</span>
|
||||
<a id="__codelineno-30-8" name="__codelineno-30-8" href="#__codelineno-30-8"></a> <span class="kd">var</span> <span class="nv">pre</span><span class="p">:</span> <span class="n">TreeNode</span><span class="p">?</span>
|
||||
<a id="__codelineno-30-9" name="__codelineno-30-9" href="#__codelineno-30-9"></a> <span class="c1">// 循环查找,越过叶节点后跳出</span>
|
||||
<a id="__codelineno-30-10" name="__codelineno-30-10" href="#__codelineno-30-10"></a> <span class="k">while</span> <span class="n">cur</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-11" name="__codelineno-30-11" href="#__codelineno-30-11"></a> <span class="c1">// 找到待删除节点,跳出循环</span>
|
||||
<a id="__codelineno-30-12" name="__codelineno-30-12" href="#__codelineno-30-12"></a> <span class="k">if</span> <span class="n">cur</span><span class="p">!.</span><span class="n">val</span> <span class="p">==</span> <span class="n">num</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-13" name="__codelineno-30-13" href="#__codelineno-30-13"></a> <span class="k">break</span>
|
||||
<a id="__codelineno-30-14" name="__codelineno-30-14" href="#__codelineno-30-14"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-15" name="__codelineno-30-15" href="#__codelineno-30-15"></a> <span class="n">pre</span> <span class="p">=</span> <span class="n">cur</span>
|
||||
<a id="__codelineno-30-16" name="__codelineno-30-16" href="#__codelineno-30-16"></a> <span class="c1">// 待删除节点在 cur 的右子树中</span>
|
||||
<a id="__codelineno-30-17" name="__codelineno-30-17" href="#__codelineno-30-17"></a> <span class="k">if</span> <span class="n">cur</span><span class="p">!.</span><span class="n">val</span> <span class="o"><</span> <span class="n">num</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-18" name="__codelineno-30-18" href="#__codelineno-30-18"></a> <span class="n">cur</span> <span class="p">=</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">right</span>
|
||||
<a id="__codelineno-30-19" name="__codelineno-30-19" href="#__codelineno-30-19"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-20" name="__codelineno-30-20" href="#__codelineno-30-20"></a> <span class="c1">// 待删除节点在 cur 的左子树中</span>
|
||||
<a id="__codelineno-30-21" name="__codelineno-30-21" href="#__codelineno-30-21"></a> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-22" name="__codelineno-30-22" href="#__codelineno-30-22"></a> <span class="n">cur</span> <span class="p">=</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">left</span>
|
||||
<a id="__codelineno-30-23" name="__codelineno-30-23" href="#__codelineno-30-23"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-24" name="__codelineno-30-24" href="#__codelineno-30-24"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-25" name="__codelineno-30-25" href="#__codelineno-30-25"></a> <span class="c1">// 若无待删除节点,则直接返回</span>
|
||||
<a id="__codelineno-30-26" name="__codelineno-30-26" href="#__codelineno-30-26"></a> <span class="k">if</span> <span class="n">cur</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-27" name="__codelineno-30-27" href="#__codelineno-30-27"></a> <span class="k">return</span>
|
||||
<a id="__codelineno-30-28" name="__codelineno-30-28" href="#__codelineno-30-28"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-29" name="__codelineno-30-29" href="#__codelineno-30-29"></a> <span class="c1">// 子节点数量 = 0 or 1</span>
|
||||
<a id="__codelineno-30-30" name="__codelineno-30-30" href="#__codelineno-30-30"></a> <span class="k">if</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">left</span> <span class="p">==</span> <span class="kc">nil</span> <span class="o">||</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">right</span> <span class="p">==</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-31" name="__codelineno-30-31" href="#__codelineno-30-31"></a> <span class="c1">// 当子节点数量 = 0 / 1 时, child = null / 该子节点</span>
|
||||
<a id="__codelineno-30-32" name="__codelineno-30-32" href="#__codelineno-30-32"></a> <span class="kd">let</span> <span class="nv">child</span> <span class="p">=</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">left</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">?</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">left</span> <span class="p">:</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">right</span>
|
||||
<a id="__codelineno-30-33" name="__codelineno-30-33" href="#__codelineno-30-33"></a> <span class="c1">// 删除节点 cur</span>
|
||||
<a id="__codelineno-30-34" name="__codelineno-30-34" href="#__codelineno-30-34"></a> <span class="k">if</span> <span class="n">cur</span> <span class="o">!==</span> <span class="n">root</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-35" name="__codelineno-30-35" href="#__codelineno-30-35"></a> <span class="k">if</span> <span class="n">pre</span><span class="p">?.</span><span class="kr">left</span> <span class="p">===</span> <span class="n">cur</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-36" name="__codelineno-30-36" href="#__codelineno-30-36"></a> <span class="n">pre</span><span class="p">?.</span><span class="kr">left</span> <span class="p">=</span> <span class="n">child</span>
|
||||
<a id="__codelineno-30-37" name="__codelineno-30-37" href="#__codelineno-30-37"></a> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-38" name="__codelineno-30-38" href="#__codelineno-30-38"></a> <span class="n">pre</span><span class="p">?.</span><span class="kr">right</span> <span class="p">=</span> <span class="n">child</span>
|
||||
<a id="__codelineno-30-39" name="__codelineno-30-39" href="#__codelineno-30-39"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-40" name="__codelineno-30-40" href="#__codelineno-30-40"></a> <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-41" name="__codelineno-30-41" href="#__codelineno-30-41"></a> <span class="c1">// 若删除节点为根节点,则重新指定根节点</span>
|
||||
<a id="__codelineno-30-42" name="__codelineno-30-42" href="#__codelineno-30-42"></a> <span class="n">root</span> <span class="p">=</span> <span class="n">child</span>
|
||||
<a id="__codelineno-30-43" name="__codelineno-30-43" href="#__codelineno-30-43"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-44" name="__codelineno-30-44" href="#__codelineno-30-44"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-45" name="__codelineno-30-45" href="#__codelineno-30-45"></a> <span class="c1">// 子节点数量 = 2</span>
|
||||
<a id="__codelineno-30-46" name="__codelineno-30-46" href="#__codelineno-30-46"></a> <span class="k">else</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-47" name="__codelineno-30-47" href="#__codelineno-30-47"></a> <span class="c1">// 获取中序遍历中 cur 的下一个节点</span>
|
||||
<a id="__codelineno-30-48" name="__codelineno-30-48" href="#__codelineno-30-48"></a> <span class="kd">var</span> <span class="nv">tmp</span> <span class="p">=</span> <span class="n">cur</span><span class="p">?.</span><span class="kr">right</span>
|
||||
<a id="__codelineno-30-49" name="__codelineno-30-49" href="#__codelineno-30-49"></a> <span class="k">while</span> <span class="n">tmp</span><span class="p">?.</span><span class="kr">left</span> <span class="o">!=</span> <span class="kc">nil</span> <span class="p">{</span>
|
||||
<a id="__codelineno-30-50" name="__codelineno-30-50" href="#__codelineno-30-50"></a> <span class="n">tmp</span> <span class="p">=</span> <span class="n">tmp</span><span class="p">?.</span><span class="kr">left</span>
|
||||
<a id="__codelineno-30-51" name="__codelineno-30-51" href="#__codelineno-30-51"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-52" name="__codelineno-30-52" href="#__codelineno-30-52"></a> <span class="c1">// 递归删除节点 tmp</span>
|
||||
<a id="__codelineno-30-53" name="__codelineno-30-53" href="#__codelineno-30-53"></a> <span class="n">remove</span><span class="p">(</span><span class="n">num</span><span class="p">:</span> <span class="n">tmp</span><span class="p">!.</span><span class="n">val</span><span class="p">)</span>
|
||||
<a id="__codelineno-30-54" name="__codelineno-30-54" href="#__codelineno-30-54"></a> <span class="c1">// 用 tmp 覆盖 cur</span>
|
||||
<a id="__codelineno-30-55" name="__codelineno-30-55" href="#__codelineno-30-55"></a> <span class="n">cur</span><span class="p">?.</span><span class="n">val</span> <span class="p">=</span> <span class="n">tmp</span><span class="p">!.</span><span class="n">val</span>
|
||||
<a id="__codelineno-30-56" name="__codelineno-30-56" href="#__codelineno-30-56"></a> <span class="p">}</span>
|
||||
<a id="__codelineno-30-57" name="__codelineno-30-57" href="#__codelineno-30-57"></a><span class="p">}</span>
|
||||
</code></pre></div>
|
||||
</div>
|
||||
<div class="tabbed-block">
|
||||
|
||||
Reference in New Issue
Block a user