Algorithm 红黑树中哨兵节点的好处?

Algorithm 红黑树中哨兵节点的好处?,algorithm,data-structures,tree,binary-search-tree,red-black-tree,Algorithm,Data Structures,Tree,Binary Search Tree,Red Black Tree,我创建了一个双链接列表,sentinel节点的好处很明显——在列表边界没有空检查或特殊情况 现在我正在写一棵红黑树,并试图找出这样一个概念是否有任何好处 我的实现基于 (自上而下插入/删除)。作者使用“虚拟树根”或“头”,以避免其插入/删除算法在根上出现特殊情况。作者的head节点的作用域是函数本身——似乎是因为它的用处有限 我遇到的另一篇文章提到,使用头上方的永久根作为迭代的“结束”。这看起来很有趣,但我试过了,没有发现使用NULL作为结束迭代器有什么真正的好处。我还发现有几篇文章使用共享哨兵

我创建了一个双链接列表,sentinel节点的好处很明显——在列表边界没有空检查或特殊情况

现在我正在写一棵红黑树,并试图找出这样一个概念是否有任何好处

我的实现基于 (自上而下插入/删除)。作者使用“虚拟树根”或“头”,以避免其插入/删除算法在根上出现特殊情况。作者的head节点的作用域是函数本身——似乎是因为它的用处有限

我遇到的另一篇文章提到,使用头上方的永久根作为迭代的“结束”。这看起来很有趣,但我试过了,没有发现使用NULL作为结束迭代器有什么真正的好处。我还发现有几篇文章使用共享哨兵来表示所有空叶节点,但这似乎比第一种情况更没有意义


有人能详细说明一下哨兵节点在红黑树中的作用吗?

红黑树的实现几乎总是使用一个黑哨兵来代表所有的叶子

当您可以检查颜色而不首先检查空值时,它可以节省大量空值检查


当然,这在使用父指针的实现中不起作用。在这些实现中,通常不使用叶哨兵,因为您需要为每个叶位置分配不同的哨兵,这会浪费大量内存。

您可以为所有叶节点使用相同的哨兵节点,而无需为每个叶分配不同的哨兵节点。sentinel节点的父指针通常未定义-可能包含随机数据。任何像样的实现都是这样做的。