红黑树 - 因为每片叶子都有两个无效的孩子,为什么还要打扰那些黑人?

时间:2016-09-17 12:27:13

标签: data-structures tree language-agnostic red-black-tree

我一直在观看关于红黑树的CS讲座以及每一个,在计算树的黑色高度时,将NULL节点计为黑色。为什么甚至打扰?例如,以下树:

enter image description here

如果我问你,这棵树的黑色高度是多少,你会说三个。但是,如果我削掉所有NULL节点(因为它们是隐含的)并再次问你,你会说两个。它真的有所作为吗?我知道一些算法,比如插入案例,你必须检查Uncle是否Black,但你会在以下代码中写出:

Node *uncle = uncle(child);
if (uncle == NULL || uncle->color == BLACK)

你不会把它写成

if (uncle->color == BLACK)

因此,如果在查看树和代码时无关紧要,我们必须从颜色中分别检查NULL,为什么甚至将它们称为相同的东西?

1 个答案:

答案 0 :(得分:0)

在插入时必须检查uncle是否为空的原因是虽然叶子的子节点被认为是黑节点,但它们本质上仍然是空的。这导致您必须在检查if uncle == null之前检查if uncle-> color == BLACK。如果uncle确实是一个叶子的孩子又名null,那么你知道它是一个叶子的孩子,并且无法进一步进入条件的另一半,否则你将得到一个异常(试图检查一个空对象的颜色会抛出一些异常)。但是,您仍然需要条件的另一半来检查树中的实际黑色对象。

但我想你问题的另一部分是为什么首先让叶子的孩子变黑?

http://www.geeksforgeeks.org/red-black-tree-set-2-insert/考虑​​这张照片 enter image description here

将30插入上面的树后,现在必须检查30岁的叔叔,因为现在有两个相邻的红色节点。请注意,虽然10岁左右的孩子也就是30岁的叔叔是空的。由于空对象表示黑色对象,因此您知道必须发生旋转情况2。你会如何在代码中检查这个?查看问题中的代码,

if (uncle == NULL || uncle->color == BLACK)

你不能只是简单地检查叔叔的颜色,因为可能会出现叔叔“无法”的情况,因此无法检查颜色。叶子的颜色在概念上是黑色的,因此在你的问题中是图片。否则,我们不会将叶子的孩子称为空,我们称他们为黑色物体。