我有这样的inorder遍历语法的递归。 T--> L | TNT
对于T
为Binary tree
且L
为Leaf
且N
为Node
的红黑树。
在搜索时,每个节点都被定义为一对(颜色,值)。我想找到两件事。
答案 0 :(得分:1)
制作
T → T N T
是(指数)不明确的,因为没有迹象表明左侧或右侧T
是否应该首先展开。
由于N
包含颜色,我们可以简单地使用解析传播颜色,以防它提供更多信息。 (这相当于通过复制T
的颜色属性或叶子的黑色来合成每个N
的颜色属性。)这导致:
RN → "red" value
BN → "black" value
RT → BT RN BT
BT → L | T BN T
T → BT | RT
这实际上没有帮助,因为第四次制作仍然是难以理解的。
事实上,没有办法消除歧义。即使每个N
都标有其黑色深度,仍然无法从有序遍历中明确地构建树。
考虑以下两棵树:
B B
/ \ / \
/ \ / \
R B R B
/ \ / \
/ \ / \
B B B B
\ /
\ /
R R
这两个都是有效的R-B树,并且具有有序遍历:
B R R B B B
因此我们必须得出结论,在有序遍历中没有足够的信息来重建原始的红黑树。
另一个问题是从二叉搜索树的有序遍历构造某些有效的红黑树。有一个自下而上的算法可以做到这一点,它不需要用它们的颜色注释节点。此外,该算法对于每个添加的节点具有O(1)复杂度。
虽然它不能表示为无上下文语法,但您可以使用谓词解析器(即,使用属性规则扩充的下推自动机,此外可以使用符号的合成属性来决定两种可能的操作。
我很确定我曾经解决过这个问题,但我没有方便的解决方案,并不会让我感到惊讶,因为在互联网上找不到它。如果您正在寻找它,我建议您从红色黑树构造的Ralph Hinze's 1999 paper开始。