红黑树插入实现 - 什么是哨兵?

时间:2014-07-31 20:12:55

标签: c++ binary-search-tree red-black-tree

我从http://web.mit.edu/~emin/www.old/source_code/cpp_trees/index.html获得了此代码 它的红黑节点的构造函数是

RedBlackTree::RedBlackTree()
{
  nil = new RedBlackTreeNode;
  nil->left = nil->right = nil->parent = nil;
  nil->red = 0;
  nil->key = MIN_INT;
  nil->storedEntry = NULL;

  root = new RedBlackTreeNode;
  root->parent = root->left = root->right = nil;
  root->key = MAX_INT;
  root->red=0;
  root->storedEntry = NULL;  
}

什么是nil,为什么在构造函数中初始化?我可以在私有数据字段中声明一个nil节点并在我的插入函数中初始化它吗?

2 个答案:

答案 0 :(得分:2)

它基本上是占位符。

从代码README: / * Sentinel用于root和nil。这些哨兵是   在RedBlackTreeCreate被篡改时创建。 root-> left应始终指向作为树根的节点。 nil指向一个节点,该节点应始终为黑色,但有一个非常小的孩子和父母,没有密钥或信息。使用这些标记的关键在于root和nil节点在代码中不需要特殊情况* /

来自维基百科red-black tree

1.节点为红色或黑色。

2.根是黑色的。 (有时会省略此规则。由于根始终可以从红色变为黑色,但反之亦然,因此该规则对分析几乎没有影响。)

3.所有叶子(NIL)都是黑色的。 (所有叶子的颜色与根相同。)

4.每个红色节点必须有两个黑色子节点。

5.从给定节点到其任何后代叶子的每条路径都包含相同数量的黑色节点。

答案 1 :(得分:1)

一个sentinel是一个空节点,它用来代替nullptr,
因为它不需要对所有的特殊处理 转角情况,即最后一个节点,第一个节点等。