每个有效的红黑树都可以存在吗?

时间:2012-07-25 09:48:35

标签: red-black-tree

假设您的red-black tree有效binary search tree并且未违反任何规则:

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

这样的红黑树看起来像这样: enter image description here

满足这些限制的每个可能的树是否都有一系列插入和删除,以便生成红黑树?

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

如果你想测试反例: 以下是a red-black tree implementation in python,其中包含用于生成图像的已实现函数。

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

  • 我画了一棵红黑树,符合所有限制。
  • 您必须找到一系列插入和删除,以便最终得到我的红黑树。

我可以画一棵红黑树让你无法获胜吗?

颜色很重要!如果树具有不同的形状或不同的颜色,则它不是相同的红黑树。

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

请注意,这只是一个检查,如果它可以工作。如果你只知道如何获得这两棵红黑树,你就无法回答这个问题!

4 个答案:

答案 0 :(得分:5)

我认为在广度优先(水平顺序)遍历中插入节点会产生任何红黑树。

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 :(得分:3)

我认为解决这类问题的数学分支是图论,并研究了一些验证红黑和其他平衡树的特性的图论论文,我引用了这篇论文:{{3} }和http://www.math.unipd.it/~baldan/Papers/Soft-copy-pdf/cosmicah05.pdf以及本文http://www.math.unipd.it/~baldan/Papers/Soft-copy-pdf/cosmicah05.pdf,他们应该能够回答您对抽象属性的疑问。或者至少帮助您以一种能够带来更好资源的方式来表达您的问题。

答案 2 :(得分:3)

如果树遵循这些规则:

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

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

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

答案 3 :(得分:3)

我认为你在这里要求的是一个正式的证据,证明在每次操作之后,如果树被重新平衡,是否可以通过一系列插入和删除来构造任意的,合法的红黑树。我不会尝试这样的证据,但我想我对如何构建这样的证据有一个想法。

我将详尽地介绍所有可能涉及单个节点周围所有合法排列的子树,并证明它可以构造。所以:

  • 黑色节点
    • 没有父母
      • 左子无效
        • 右子null
        • 正确的孩子不是空的
      • 左子不是空的
        • 右子null
        • 正确的孩子不是空的
    • 是左孩子
      • 与上述相同
    • 是正确的孩子
      • 与上述相同
  • 红色节点(不能没有父节点)
    • 是左孩子
      • 与上述相同
    • 是正确的孩子
      • 与上述相同

然后你必须创建一个归纳步骤,表明任意树都是上面显示的情况的排列。看起来非常简单,当我这么说时,但就像我在评论中提到的那样,我太生疏了,无法解决实际的证据。