diff --git a/ebook/zh/03.01.md b/ebook/zh/03.01.md index c5ceb63ac..e191bd2fb 100644 --- a/ebook/zh/03.01.md +++ b/ebook/zh/03.01.md @@ -336,7 +336,9 @@ RB-DELETE-FIXUP(T, x) 恢复与保持红黑性质的工作 - b)当前结点是黑+黑且是根结点, 解法:什么都不做,结束。 -但如果是以下情况呢?: +实际上也就是,当删除结点为红色,或者顶替结点为红色,或者删除结点为根时,处理情况都比较简单。需要着重考虑的是以下复杂情形。 + +如果是以下情况: - 删除修复情况1:当前结点是黑+黑且兄弟结点为红色(此时父结点和兄弟结点的子结点分为黑) - 删除修复情况2:当前结点是黑加黑且兄弟是黑色且兄弟结点的两个子结点全为黑色 - 删除修复情况3:当前结点颜色是黑+黑,兄弟结点是黑色,兄弟的左子是红色,右子是黑色 @@ -347,9 +349,9 @@ RB-DELETE-FIXUP(T, x) 恢复与保持红黑性质的工作 下面,咱们便来分别处理这4种删除修复情况。 -**删除修复情况1:当前结点是黑+黑且兄弟结点为红色(此时父结点和兄弟结点的子结点分为黑)。** +**删除修复情况1:当前结点是黑+黑且兄弟结点为红色(此时父结点和兄弟结点的子结点都为黑)。** - 解法:把父结点染成红色,把兄弟结点染成黑色,之后重新进入算法(我们只讨论当前结点是其父结点左孩子时的情况)。此变换后原红黑树性质5不变,而把问题转化为兄弟结点为黑色的情况(注:变化前,原本就未违反性质5,只是为了**把问题转化为兄弟结点为黑色的情况**)。 即如下代码操作: + 解法:把父结点染成红色,把兄弟结点染成黑色,以父结点为支点进行左旋,之后重新进入算法(我们只讨论当前结点是其父结点左孩子时的情况)。此变换后原红黑树性质5不变,而把问题转化为兄弟结点为黑色的情况(注:变化前,原本就未违反性质5,只是为了**把问题转化为兄弟结点为黑色的情况**)。 即如下代码操作: ``` //调用RB-DELETE-FIXUP(T, x) 的1-8行代码 1 while x ≠ root[T] and color[x] = BLACK @@ -371,7 +373,7 @@ RB-DELETE-FIXUP(T, x) 恢复与保持红黑性质的工作 **删除修复情况2:当前结点是黑加黑且兄弟是黑色且兄弟结点的两个子结点全为黑色。** - 解法:把当前结点和兄弟结点中抽取一重黑色追加到父结点上,把父结点当成新的当前结点,重新进入算法。(此变换后性质5不变),即调用RB-INSERT-FIXUP(T, z) 的第9-10行代码操作,如下: + 解法:把兄弟结点变为红色,把当前结点和兄弟结点中抽取一重黑色追加到父结点上,把父结点当成新的当前结点,重新进入算法。(此变换后性质5不变),即调用RB-INSERT-FIXUP(T, z) 的第9-10行代码操作,如下: ``` //调用RB-DELETE-FIXUP(T, x) 的9-11行代码 9 if color[left[w]] = BLACK and color[right[w]] = BLACK @@ -388,7 +390,7 @@ RB-DELETE-FIXUP(T, x) 恢复与保持红黑性质的工作 **删除修复情况3:当前结点颜色是黑+黑,兄弟结点是黑色,兄弟的左子是红色,右子是黑色。** - 解法:把兄弟结点染红,兄弟左子结点染黑,之后再在兄弟结点为支点解右旋,之后重新进入算法。此是把当前的情况转化为情况4,而性质5得以保持,即调用RB-INSERT-FIXUP(T, z) 的第12-16行代码,如下所示: + 解法:把兄弟结点染红,兄弟左子结点染黑,之后再在兄弟结点为支点进行右旋,之后重新进入算法。此是把当前的情况转化为情况4,而性质5得以保持,即调用RB-INSERT-FIXUP(T, z) 的第12-16行代码,如下所示: ``` //调用RB-DELETE-FIXUP(T, x) 的第12-16行代码 12 else if color[right[w]] = BLACK