Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 红黑树是如何工作的?_Algorithm_Language Agnostic_Binary Tree_Red Black Tree - Fatal编程技术网

Algorithm 红黑树是如何工作的?

Algorithm 红黑树是如何工作的?,algorithm,language-agnostic,binary-tree,red-black-tree,Algorithm,Language Agnostic,Binary Tree,Red Black Tree,关于红黑树有很多问题,但没有一个能回答它们是如何工作的。为什么叫红黑?这如何保持树的平衡(从而比不平衡的普通二叉搜索树提高性能)?我只是想了解它的工作原理和原因。对于搜索和遍历,它与任何二叉树都是一样的 对于插入和删除,应用了更复杂的算法,以确保树不会过于不平衡。这些保证了所有单项操作总是在最坏的O(logn)时间运行,而在一个简单的二叉树中,二叉树可能变得非常不平衡,以至于它实际上是一个链表,为每个单项操作提供了O(n)最坏情况下的性能 红黑树的基本思想是模仿每个节点最多有3个键和4个子节点的

关于红黑树有很多问题,但没有一个能回答它们是如何工作的。为什么叫红黑?这如何保持树的平衡(从而比不平衡的普通二叉搜索树提高性能)?我只是想了解它的工作原理和原因。

对于搜索和遍历,它与任何二叉树都是一样的

对于插入和删除,应用了更复杂的算法,以确保树不会过于不平衡。这些保证了所有单项操作总是在最坏的O(logn)时间运行,而在一个简单的二叉树中,二叉树可能变得非常不平衡,以至于它实际上是一个链表,为每个单项操作提供了O(n)最坏情况下的性能

红黑树的基本思想是模仿每个节点最多有3个键和4个子节点的B树。B树(或B+树等变体)主要用于数据库索引和存储在硬盘上的数据

每个二叉树节点都有一个“颜色”——红色或黑色。在B-树类比中,每个黑色节点都是适合该B-树节点的子树的子树根。如果此节点具有红色子节点,则它们也被视为同一B树节点的一部分。因此,在保留(大多数)结构的情况下,将红黑树转换为B树并返回是可能的(尽管在实践中没有这样做)。唯一可能的异常是,当B-树节点有两个键和三个子节点时,您可以选择将哪个键放入等效红黑树的黑色节点中

例如,对于红黑树,从根到叶的每一行都有相同数量的黑色节点。此规则源自B-树规则,即所有叶节点位于同一深度

虽然这是红黑树的基本思想,但实际上用于插入和删除的算法在更新过程中被修改以强制执行所有B-树规则(可能有一个小的例外-我忘了),但它们是针对二叉树形式定制的。这意味着,与执行B树插入或删除相比,执行红黑树插入或删除可能会为结果提供不同的结构


有关更多详细信息,请遵循MigDus已经提供的说明。

红黑树是一种有序二叉树,其中每个顶点都是红色或黑色的直觉是红色顶点应被视为与其父顶点处于同一高度(即,红色顶点的边被视为“水平”而不是“下降”)

[我不相信维基百科的条目能清楚地说明这一点。]

红黑树的常规规则要求红色顶点永远不要指向另一个红色顶点。这意味着以黑色顶点为根的任何子树(bbb,bbr,rbb,rbr--for[left child][root][right child])的可能顶点排列对应于234棵树

搜索红黑树与搜索普通二叉树是一样的。插入和删除是类似的,只是在某些点可能需要“修复”旋转以保持红黑不变量


干杯

“直觉是,红色顶点应被视为与其父顶点处于同一高度(即,红色顶点的边被视为“水平”而不是“下降”)。”灯泡时刻,谢谢!