【问题标题】:Can every valid red-black tree exist?每棵有效的红黑树都存在吗?
【发布时间】:2012-07-23 17:25:22
【问题描述】:

假设您有一个red-black tree,它是一个有效的binary search tree,并且不违反任何这些规则:

  • 节点不是红色就是黑色。
  • 根是黑色的。
  • 所有叶子 (NIL) 都是黑色的。
  • 每个红色节点的两个子节点都是黑色的。
  • 从给定节点到其任何后代叶子的每条简单路径都包含相同数量的黑色节点。

这样一棵红黑树是这样的:

是否所有满足这些限制的可能树都有插入和删除的序列,从而生成红黑树?

我问这个问题,因为我想写一篇关于红黑树的博客文章,我想举一些例子。

如果你想测试一个反例: 这里是a red-black tree implementation in python,带有一个生成图像的实现函数。

澄清问题:我们制作游戏。

  • 我画了一棵符合所有限制的红黑树。
  • 你必须找到插入和删除的序列,这样你才能得到我的红黑树。

我可以画一棵红黑树,这样你就赢不了了吗?

颜色很重要!如果树有不同的形状或不同的颜色,它就不是同一棵红黑树。

你至少应该知道如何生成这两个红黑树:

请注意,这只是对您是否可行的检查。如果你只知道如何得到这两个红黑树,你是无法回答这个问题的!

【问题讨论】:

  • 我试图抹去我关于图论的计算机科学知识,但当我接触到它时,整个事情就崩溃了……开玩笑的,你可能想把这个发帖到cstheory.stackexchange.com 以获得更多信息适当的关注。

标签: red-black-tree


【解决方案1】:

我相信以广度优先(级别顺序)遍历插入节点将产生任何红黑树。

http://en.wikipedia.org/wiki/Tree_traversal#Queue-based_level_order_traversal

因为您按级别顺序插入它们,所以您不能拥有比原始树更不平衡的树。不需要删除,插入过程中也不需要旋转。在您的示例中,您应该按以下顺序插入它们:

13,8,17,1,11,15,25,6,22,27

编辑:虽然这将生成具有正确值和形状的二叉搜索树,但这可能不会生成正确的颜色......这取决于插入函数的实现。原因是红黑树的定义允许当树有多个节点并且是完整的并且所有叶子都处于相同深度时节点颜色的变化 - 按照维基百科的定义,这是一棵“完美”的二叉树:

http://en.wikipedia.org/wiki/Binary_tree#Types_of_binary_trees

假设树有三个节点,其值为 {1,2,3},其中“2”是根节点,根据定义,它是黑色的。节点 {1,3} 既可以是黑色也可以是红色而不违反红黑规则。因此,红黑插入的完美有效实现可以检测树何时“完美”并将每个节点着色为黑色。这样的实现将阻止构建一棵树,例如,在每个级别交替黑色和红色。

编辑 2:鉴于两个红黑树都是可能的输入(所有三个节点为黑色,节点 1 和 3 均为红色),这就解决了是否需要删除的问题,如果有解决方案,则需要删除。我现在想到的问题是是否只有一种方法可以实现红黑树插入/删除。如果有不止一个,并且如果它们产生不同的树,那么游戏玩家将必须了解实现,以便指定插入和删除的顺序来构建给定的红黑树。我对红黑树的实现知之甚少,无法回答是只有一种实现方式还是有多种实现方式的问题。

【讨论】:

  • 哦,天哪,每当我读到一个明显正确的答案时,我都会感到不寒而栗。 +1 先生。
  • 谢谢,这不是正式的证明,但看起来很直观。证明是说服某人某事的论据,因此它似乎成功了。
  • “因此,一个完全有效的红黑插入实现可以检测树何时“完美”并将每个节点着色为黑色。”:不,它无法检测到。如果您想检测这棵树是否完美,则必须遍历这三个。那不在O(log n) 中。所以你的插入和删除不会在O(log n) 中,这是红黑树最重要的特征。可以得到正确的形状是显而易见的,但你可以得到正确的颜色就不是那么明显了。如果要获得所有可能的具有三个节点的 RB 树,则必须使用删除
  • 我添加了两个示例红黑树。无论你如何实现插入,如果你按照你建议的顺序插入节点,你不能只通过插入得到两棵红黑树。
【解决方案2】:

我认为您在这里要求的是正式证明是否可以通过一系列插入和删除来构造任意合法的红黑树,前提是在每次操作后重新平衡树。我不打算尝试这样的证明,但我想我知道如何构建这样的证明。

我会详尽地涵盖所有可能的子树,涉及单个节点周围的所有合法排列,并证明它是可以构建的。所以:

  • 黑节点
    • 没有父级
      • 左孩子空
        • 右孩子为空
        • 右孩子不为空
      • 左孩子不为空
        • 右孩子为空
        • 右孩子不为空
    • 是左孩子
      • 同上
    • 是正确的孩子
      • 同上
  • 红色节点(不能没有父节点)
    • 是左孩子
      • 同上
    • 是正确的孩子
      • 同上

然后您必须创建一个归纳步骤,表明任何任意树都是上述情况的排列。当我这样说时,这似乎很简单,但就像我在评论中提到的那样,我太生疏了,无法处理实际的证明。

【讨论】:

  • +1。我遇到了一个问题:每棵高度最多为 2*log n 的二叉树都可以通过将红色或黑色着色为 RB 树而无需任何其他更改?我认为不,因为可能是半平衡的,但违反了其他属性,例如超过两倍的路径长度。我对吗?事实上我的问题是 2 log n 的高度可以告诉我们总是可以通过着色转换为 RB?
【解决方案3】:

我认为处理这类问题的数学分支是图论,并查看了一些验证红黑树和其他平衡树属性的图论论文,我被引导到这篇论文:http://www.math.unipd.it/~baldan/Papers/Soft-copy-pdf/cosmicah05.pdfhttp://www.math.unipd.it/~baldan/Papers/Soft-copy-pdf/cosmicah05.pdf 和这篇论文 http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.87.1161&rep=rep1&type=pdf ,他们应该能够回答您对抽象属性的疑问。或者至少可以帮助您以一种能够带来更好资源的方式来表达您的问题。

【讨论】:

  • 三个链接中的两个实际上是同一个链接。你想再提供一个吗?此外,我在这些论文中找不到我的问题的答案(但我必须更仔细地阅读它们,这需要一些时间)
【解决方案4】:

如果一棵树遵循以下规则:

  • 节点不是红色就是黑色。
  • 根是黑色的。
  • 所有叶子 (NIL) 都是黑色的。
  • 每个红色节点的两个子节点都是黑色的。
  • 从给定节点到其任何后代叶子的每条简单路径都包含相同数量的黑色节点。

它将是一棵平衡二叉树,可以称为红黑树。

红黑树的插入和删除有特殊的条件和规则。如果您的示例中的树遵循 RB 树插入和删除算法,则它将始终是 RB 树。 在插入和删除过程中,不平衡的二叉树总是会通过改变节点颜色、旋转节点或分支来恢复为平衡树。

【讨论】:

  • 这不能回答我的问题。我问过:“满足这些限制的每棵可能的树是否都有一系列插入和删除,以便生成红黑树?”不是“是否可以为任何输入创建数据结构 RB-Tree”
  • @Moose 如果树在插入或删除序列后满足所有限制(如果有节点)。它是一个 RB 树。
  • 对你的游戏的回答是 NO。如果您在插入和删除过程中遵循规则,您将始终得到一个 RB 树。在我学习 RB 树的阶段,我尝试了很多组合。
  • 但是您没有尝试 ALL 组合。这可能表明这是不可能的,但这不是证据。
  • 我假设数据是可排序的,那么你将无法得到它。并且无法排序的数据我不知道是否存在它们的 RB 树。如果您看到算法,当您插入数据并且不满足条件时,树将被平衡,直到根与删除相同。因此,插入和删除树将使用重组或重新着色来平衡自身。如果它不平衡,我们可以平衡任何二叉树。因此,“否”是答案,除非你能找到任何算法都无法平衡的二叉树。
【解决方案5】:

我不确定答案是否定的,我会在下面说明原因。如果可以做到,则需要插入比需要更多的节点,然后删除其他节点。

您可以删除任意红色叶子节点,树不会改变形状或重新着色。您可以在树根部的黑色父节点下插入任意红色叶子节点,而不会改变树的形状。

如果您需要使树的一侧更茂密,则在该位置插入节点就足够了。这将首先导致树更上层的重新着色,然后最终重新平衡。

我认为无法做到的原因是删除有2个孩子的节点,这样做的方式是将节点与后继或前任节点交换(任何一个都有效),然后删除它有的节点搬去。有继任者或前任者的选择,产生的树会有所不同。因此,您需要控制删除的这一方面并到达某个树,可能需要说“删除节点 A 使用后继”,现在“删除节点 B 使用前任”

【讨论】:

    【解决方案6】:

    红黑树分解为灵活的红色缓存和不变的黑色支持。为了保持黑色高度不变,您必须将红色缓存移动到顶部,这样您就可以调整高度。粗略地说,在不移动真实节点的情况下,可以轻松移动红色容量。红色容量必须不断交换到黑色树顶,从而生成全局红色瀑布。

    红色容量下移,黑色分支上移。

    【讨论】:

    • 你读过这个问题吗?
    • 可以直接在树顶插入红色节点,改变黑色高度。
    • 二叉树的体积是线性增长的,所以代价基本是线性的。抛硬币距离为线性的充分条件是要么不可逆要么是二维的,否则压缩1/4的对数代价
    • 我认为这是“不,我没有阅读问题”
    猜你喜欢
    • 2014-06-28
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2013-02-01
    • 2018-08-05
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    相关资源
    最近更新 更多