我正在查看插入增强红黑树的代码。此树有一个名为“size”的附加字段,它保持以节点x为根的子树的大小。以下是插入新节点的伪代码:
AugmentedRBT_Insert(T,x){
BST_Insert(T,x); //insert as if it is a normal BST
x[color]=red; //insert as a red node
size[x]=1;
tmp=parent[x];
while(tmp!=NULL){ //start from the node x and follow the path to root
size[tmp]=size[tmp]+1; //update the size of each node
tmp=parent[tmp];
}
}
忘记修复着色和旋转,它们将在另一个功能中完成。我的问题是,为什么我们将新添加的节点“x”的大小设置为1?我知道它不会有任何子树,因此它的大小必须为1,但RBT的一个要求是每个红色节点都有两个黑色子节点,实际上每个叶子节点都是NULL,即使我们插入节点“x “作为黑色,它仍然应该有2个黑色NULL节点,我认为我们必须将它的大小设置为3?我错了吗?
感谢。
答案 0 :(得分:1)
在大多数二叉树中,红黑树中的插入直接发生在叶子上。因此,以叶子为根的子树的大小为1.红色节点确实有两个黑孩子,因为leaves always have the "root" or "nil" as a child, which is black。那些空元素不是节点,所以我们不计算它们。
然后,我们去调整所有父母的大小直到根(他们每个人都为我们刚刚添加的节点获得+1)。
最后,如果需要,我们在旋转树以平衡它时修复这些值。在您的实现中,您可能希望在一次传递中而不是两次传递大小更新和旋转。