在维基百科: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。
答案 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,其链接可以保证不会被发表评论:
......这正是这里使用的技术。