我一直在寻找一种方法来检查红黑树的这个属性:“从节点到空节点的每条路径必须包含相同数量的黑色节点”。
大多数赞成的答案都是这样的:
// 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
/\ /\ /\ / \
提前谢谢!
答案 0 :(得分:1)
代码最终检查所有路径的原因,至少我理解它的方式,是因为该功能同时具有"左移"并且"向右走"因此,对于每个节点都要进行左右扫描,因此将覆盖所有路径。此外,确定左侧节点是否为黑色只是确定是否将一个添加到黑色路径长度(对于每个递归调用)。