我一直在观看关于红黑树的CS讲座以及每一个,在计算树的黑色高度时,将NULL
节点计为黑色。为什么甚至打扰?例如,以下树:
如果我问你,这棵树的黑色高度是多少,你会说三个。但是,如果我削掉所有NULL
节点(因为它们是隐含的)并再次问你,你会说两个。它真的有所作为吗?我知道一些算法,比如插入案例,你必须检查Uncle
是否Black
,但你会在以下代码中写出:
Node *uncle = uncle(child);
if (uncle == NULL || uncle->color == BLACK)
你不会把它写成
if (uncle->color == BLACK)
因此,如果在查看树和代码时无关紧要,我们必须从颜色中分别检查NULL
,为什么甚至将它们称为相同的东西?
答案 0 :(得分:0)
在插入时必须检查uncle
是否为空的原因是虽然叶子的子节点被认为是黑节点,但它们本质上仍然是空的。这导致您必须在检查if uncle == null
之前检查if uncle-> color == BLACK
。如果uncle
确实是一个叶子的孩子又名null
,那么你知道它是一个叶子的孩子,并且无法进一步进入条件的另一半,否则你将得到一个异常(试图检查一个空对象的颜色会抛出一些异常)。但是,您仍然需要条件的另一半来检查树中的实际黑色对象。
但我想你问题的另一部分是为什么首先让叶子的孩子变黑?
从http://www.geeksforgeeks.org/red-black-tree-set-2-insert/考虑这张照片
将30插入上面的树后,现在必须检查30岁的叔叔,因为现在有两个相邻的红色节点。请注意,虽然10岁左右的孩子也就是30岁的叔叔是空的。由于空对象表示黑色对象,因此您知道必须发生旋转情况2。你会如何在代码中检查这个?查看问题中的代码,
if (uncle == NULL || uncle->color == BLACK)
你不能只是简单地检查叔叔的颜色,因为可能会出现叔叔“无法”的情况,因此无法检查颜色。叶子的颜色在概念上是黑色的,因此在你的问题中是图片。否则,我们不会将叶子的孩子称为空,我们称他们为黑色物体。