rbtree-remedydoubleblack.html

来自「经典的数据结构源代码(java 实现)」· HTML 代码 · 共 57 行

HTML
57
字号
<html><head><title>Code Fragment</title></head><body text=#000000><center></center><br><br><dl><dd><pre>  <font color=#8000a0><font color=#8000a0>public</font> </font>Entry&lt;K,V&gt; <font color=#0000ff>remove</font>(Entry&lt;K,V&gt; ent) <font color=#8000a0><font color=#ff8000>throws</font> </font>InvalidEntryException {    Entry&lt;K,V&gt; toReturn = <font color=#ff8000>super</font>.<font color=#0000ff>remove</font>(ent);    Position&lt;Entry&lt;K,V&gt;&gt; posR = actionPos;    <font color=#ff8000>if</font><font color=#0000ff> </font>(toReturn != null) {	      <font color=#ff8000>if</font><font color=#0000ff> </font>(<font color=#0000ff>wasParentRed</font>(posR) || <font color=#0000ff>isRoot</font>(posR) || <font color=#0000ff>isPosRed</font>(posR))	<font color=#0000ff>setBlack</font>(posR);      <font color=#ff8000>else</font>	<font color=#0000ff>remedyDoubleBlack</font>(posR);    }    <font color=#8000a0><font color=#ff8000>return</font> </font>toReturn;  }  <font color=#8000a0><font color=#8000a0>protected</font> </font><font color=#8000a0>void</font> <font color=#0000ff>remedyDoubleBlack</font>(Position&lt;Entry&lt;K,V&gt;&gt; posR) {    Position&lt;Entry&lt;K,V&gt;&gt; posX, posY, posZ;    <font color=#8000a0><font color=#8000a0>boolean</font> </font>oldColor;    posX = <font color=#0000ff>parent</font>(posR);    posY = <font color=#0000ff>sibling</font>(posR);    <font color=#ff8000>if</font><font color=#0000ff> </font>(!<font color=#0000ff>isPosRed</font>(posY))  {      posZ = <font color=#0000ff>redChild</font>(posY);      <font color=#ff8000>if</font><font color=#0000ff> </font>(<font color=#0000ff>hasRedChild</font>(posY))  { <font color=#ff0080>// Case 1: trinode restructuring</font>      	oldColor = <font color=#0000ff>isPosRed</font>(posX);	posZ = <font color=#0000ff>restructure</font>(posZ);      	<font color=#0000ff>setColor</font>(posZ, oldColor);	<font color=#0000ff>setBlack</font>(posR);      	<font color=#0000ff>setBlack</font>(<font color=#0000ff>left</font>(posZ));      	<font color=#0000ff>setBlack</font>(<font color=#0000ff>right</font>(posZ));	<font color=#ff8000>return</font>;      }      <font color=#0000ff>setBlack</font>(posR);      <font color=#0000ff>setRed</font>(posY);      <font color=#ff8000>if</font><font color=#0000ff> </font>(!<font color=#0000ff>isPosRed</font>(posX))  { <font color=#ff0080>// Case 2: recoloring</font>        <font color=#ff8000>if</font><font color=#0000ff> </font>(!<font color=#0000ff>isRoot</font>(posX))	  <font color=#0000ff>remedyDoubleBlack</font>(posX);	<font color=#ff8000>return</font>;      }      <font color=#0000ff>setBlack</font>(posX);      <font color=#ff8000>return</font>;    } <font color=#ff0080>// Case 3: adjustment</font>    <font color=#ff8000>if</font><font color=#0000ff> </font>(posY == <font color=#0000ff>right</font>(posX)) posZ = <font color=#0000ff>right</font>(posY);    <font color=#8000a0><font color=#ff8000>else</font> </font>posZ = <font color=#0000ff>left</font>(posY);    <font color=#0000ff>restructure</font>(posZ);    <font color=#0000ff>setBlack</font>(posY);    <font color=#0000ff>setRed</font>(posX);    <font color=#0000ff>remedyDoubleBlack</font>(posR);  }</dl></body></html>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?