This commit is contained in:
krahets
2023-07-24 13:09:54 +08:00
parent 3e2ab6a857
commit 72ae5c4673
17 changed files with 942 additions and 265 deletions
+66 -68
View File
@@ -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">-&gt;</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">&lt;</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">&gt;</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">-&gt;</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">&lt;</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">&gt;</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">-&gt;</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">&lt;</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">&gt;</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">-&gt;</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">&lt;</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">&gt;</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">