RBTree的颜色技巧如何运作?

时间:2013-04-30 01:54:15

标签: c red-black-tree

在维基百科:Red-black_tree

  
    

跟踪每个节点的颜色每个节点只需要1位信息,因为>只有两种颜色。该树不包含任何其他特定于其为红色 - >黑色树的数据,因此其内存占用量几乎与经典(无色)二进制搜索>树相同。在许多情况下,可以在没有额外存储器的情况下存储额外的信息位。

  

我在C中找到了rbtree的工具:

#ifdef UINTPTR_MAX

static inline enum rb_color get_color(const struct rbtree_node *node)
{
    return node->parent & 1;
}

static inline void set_color(enum rb_color color, struct rbtree_node *node)
{
    node->parent = (node->parent & ~1UL) | color;
}

static inline struct rbtree_node *get_parent(const struct rbtree_node *node)
{ 
    return (struct rbtree_node *)(node->parent & ~1UL);
}

static inline void set_parent(struct rbtree_node *parent, struct rbtree_node *node)
{
    node->parent = (uintptr_t)parent | (node->parent & 1);
}

#else
...
#endif

我的问题是这种颜色技巧是如何工作的?Thx。

1 个答案:

答案 0 :(得分:5)

它正在使用一个(非常粗略的)技巧来改变指向父节点的指针来存储一个指示颜色的位。该指针中的最低有效位包含颜色:

static inline enum rb_color get_color(const struct rbtree_node *node)
{
    return node->parent & 1;
}

如果低位为0,则颜色为红色,如果低位为1,则颜色为黑色。 (意识到红色是0而黑色是1是否无关紧要,反之亦然。


@Daniel Fischer commented,其链接可以保证不会被发表评论:

  

http://en.wikipedia.org/wiki/Pointer_tagging

......这正是这里使用的技术。