如果我有一个二叉树,并且想要将black / red属性添加到它的所有节点以形成一个红黑树,如果我们知道二叉树是平衡的,有没有办法做到这一点?
答案 0 :(得分:1)
红黑树上最严格的条件可能是任何root-NULL路径都必须包含相同数量的黑色节点。因此,一种选择是从根目录运行DFS开始,以确定最短的root-NULL路径的长度。此路径长度给出了树的“黑色高度”的上限,这是任何root-NULL路径上的黑色节点数。
一旦我们得到这个值,我们就可以尝试以一种让我们确定哪些节点是红色或黑色的方式为节点分配黑色高度。一个有用的观察结果如下:任何节点的子树的黑色高度必须相同,否则有两个根空路径将具有不同的黑色高度。因此,对于每个节点,如果其当前黑色高度为h并且所需的黑色高度为H,则我们可以
我认为你可以通过使用动态编程来做到这一点。假设所需的目标黑色高度为H,我们可以制作一个以节点/黑色深度/颜色三角形为索引的表(这里,黑色高度是以该节点为根的子树的黑色高度),用于存储是否可以对其进行着色节点以正确的方式。我们称之为T [v,h,c]。我们可以填写如下:
评估完毕后,您可以检查T [root,h,c]对于任何高度h或颜色c是否为真。这应该只需要多项式时间。
希望这有帮助!
答案 1 :(得分:0)
Templatetypedef已经以非常好的方式回答了你问题的主要部分。我只是想为你的第二个问题添加答案。
由于红黑标记用于防止不平衡的树木出现,因此当然不可能为每个搜索树着色 - 如果它没有实现任何目的!一个反例就是这棵树:
1
\
2
\
3
所有左子女都为空。