解释红黑树中的黑色高度算法

时间:2017-11-23 22:32:19

标签: algorithm data-structures tree

我一直在寻找一种方法来检查红黑树的这个属性:“从节点到空节点的每条路径必须包含相同数量的黑色节点”。

大多数赞成的答案都是这样的:

// Return the black-height of node x.  If its subtrees do not have
// the same black-height, call attention to it.

private int checkBlackHeight(Node x) {
if (x == null)
  return 0;
else {
  int leftBlackHeight = checkBlackHeight(x.left) +
      (x.left.isBlack() ? 1 : 0);
  int rightBlackHeight = checkBlackHeight(x.right) +
      (x.right.isBlack() ? 1 : 0);
  if (leftBlackHeight != rightBlackHeight)
      complain("blackheight error", x);
  return leftBlackHeight;
  }
}

我感到困惑的是,这段代码只检查树下最左边和最右边的路径吗?它如何检查内部路径? 例如在下面的树中,它应该检查路径11-9-8- ..和11-16-18 ...但它是否检查11-16-13-(一些内部节点)-...

         11
       /    \
      9     16
     / \    /  \
    8  10  13   18
   /\  /\  /\   / \

提前谢谢!

1 个答案:

答案 0 :(得分:1)

代码最终检查所有路径的原因,至少我理解它的方式,是因为该功能同时具有"左移"并且"向右走"因此,对于每个节点都要进行左右扫描,因此将覆盖所有路径。此外,确定左侧节点是否为黑色只是确定是否将一个添加到黑色路径长度(对于每个递归调用)。