【问题标题】:red black tree insert implementation - what is a sentinel?红黑树插入实现 - 什么是哨兵?
【发布时间】:2014-09-23 22:35:48
【问题描述】:

我从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 节点并在我的插入函数中初始化它吗?

【问题讨论】:

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


【解决方案1】:

哨兵是一个空节点,它被用来代替nullptr,
因为它消除了对所有
极端情况,即最后一个节点,第一个节点等。

【讨论】:

    【解决方案2】:

    它基本上是一个占位符。

    从代码自述文件中: /* 哨兵用于 root 和 nil。这些哨兵是 在调用 RedBlackTreeCreate 时创建。 root->left 应该始终指向作为树根的节点。 nil 指向一个应该始终为黑色但具有任意子节点和父节点且没有密钥或信息的节点。使用这些哨兵的目的是让根节点和 nil 节点在代码中不需要特殊情况 */

    来自维基百科red-black tree

    1.一个节点不是红色就是黑色。

    2.根是黑色的。 (这条规则有时会被省略。由于根总是可以从红色变为黑色,但不一定反过来,这条规则对分析影响不大。)

    3.所有叶子 (NIL) 都是黑色的。 (所有的叶子都和根的颜色一样。)

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

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

    【讨论】:

      猜你喜欢
      • 2018-06-17
      • 2020-12-02
      • 1970-01-01
      • 2018-11-06
      • 2013-11-17
      • 1970-01-01
      • 2015-05-18
      相关资源
      最近更新 更多