ウィキペディア: Red-black_tree
色は 2 つしかないため、各ノードの色を追跡するには、ノードごとに 1 ビットの情報しか必要としません。ツリーには、赤→黒ツリーであることに固有の他のデータが含まれていないため、そのメモリ フットプリントは、従来の (色付けされていない) 二分探索 >tree とほぼ同じです。多くの場合、追加の情報ビットは、追加のメモリ > コストなしで保存できます。
そして、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.