关于红黑树的问题

时间:2013-10-18 23:12:09

标签: algorithm data-structures binary-tree red-black-tree

如果我有一个二叉树,并且想要将black / red属性添加到它的所有节点以形成一个红黑树,如果我们知道二叉树是平衡的,有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

红黑树上最严格的条件可能是任何root-NULL路径都必须包含相同数量的黑色节点。因此,一种选择是从根目录运行DFS开始,以确定最短的root-NULL路径的长度。此路径长度给出了树的“黑色高度”的上限,这是任何root-NULL路径上的黑色节点数。

一旦我们得到这个值,我们就可以尝试以一种让我们确定哪些节点是红色或黑色的方式为节点分配黑色高度。一个有用的观察结果如下:任何节点的子树的黑色高度必须相同,否则有两个根空路径将具有不同的黑色高度。因此,对于每个节点,如果其当前黑色高度为h并且所需的黑色高度为H,则我们可以

  • 将其着色为红色,在这种情况下,我们递归地对左右子树进行着色,使得它们具有黑色高度H.我们还强制下面这些子树的根部为黑色。
  • 将其着色为黑色,在这种情况下,我们递归地对左右子树进行着色,使得它们具有黑色高度H-1。这些树根处的节点可以是颜色。

我认为你可以通过使用动态编程来做到这一点。假设所需的目标黑色高度为H,我们可以制作一个以节点/黑色深度/颜色三角形为索引的表(这里,黑色高度是以该节点为根的子树的黑色高度),用于存储是否可以对其进行着色节点以正确的方式。我们称之为T [v,h,c]。我们可以填写如下:

  • 将NULL视为黑色的节点。 T [null,0,red] = false,T [null,0,black] = true。
  • 对于每个节点,按顺序处理,只有在处理其子树l和r时才处理v,请执行以下操作:
    • T [v,h,red] = T [l,h,black]和T [r,h,black]
    • T [v,h,black] = T [l,h - 1,c]和T [r,h - 1,c]对于任何颜色c

评估完毕后,您可以检查T [root,h,c]对于任何高度h或颜色c是否为真。这应该只需要多项式时间。

希望这有帮助!

答案 1 :(得分:0)

Templatetypedef已经以非常好的方式回答了你问题的主要部分。我只是想为你的第二个问题添加答案。

由于红黑标记用于防止不平衡的树木出现,因此当然不可能为每个搜索树着色 - 如果它没有实现任何目的!一个反例就是这棵树:

1
 \
  2
   \
    3

所有左子女都为空。