【发布时间】:2017-07-19 11:52:55
【问题描述】:
我正在尝试实现红黑树数据结构,并遇到了来自 Apple 开源项目的 this 示例。这是创建树的代码:
/*
* Create a red black tree struct using the specified compare routine.
* Allocates and returns the initialized (empty) tree.
*/
struct rbtree *
rbcreate(compar)
int (*compar)__P((const void *, const void*));
{
struct rbtree *tree;
tree = (struct rbtree *) emalloc(sizeof(*tree));
tree->compar = compar;
/*
* We use a self-referencing sentinel node called nil to simplify the
* code by avoiding the need to check for NULL pointers.
*/
tree->nil.left = tree->nil.right = tree->nil.parent = &tree->nil;
tree->nil.color = black;
tree->nil.data = NULL;
/*
* Similarly, the fake root node keeps us from having to worry
* about splitting the root.
*/
tree->root.left = tree->root.right = tree->root.parent = &tree->nil;
tree->root.color = black;
tree->root.data = NULL;
return(tree);
}
我想知道让哨兵节点而不是让子节点指向NULL 的原因是什么。无论如何,据我所知,我们必须进行检查。
我也不明白为什么我们需要假根,以及根在理论上是如何分裂的?
【问题讨论】:
-
如果我没记错的话,一个常见的技巧是将“r-b-flag”放入其中一个通常为 0 的子指针的最低位(由于地址的字对齐)。这为每个节点节省了一个字节甚至一个字。在这种情况下,与 0 的比较可能必须掩盖这一点 - 与自身的比较不是。但是,这只是猜测......
-
@Scheff:可能是这样,但这里引用的代码似乎存储了一个单独的颜色成员。
-
对不起,我什至没有阅读代码 - 我的错......
标签: c data-structures tree binary-search-tree