寻找红黑树的属性语法

时间:2016-01-08 19:10:10

标签: binary-tree binary-search-tree context-free-grammar red-black-tree formal-languages

我有这样的inorder遍历语法的递归。 T--> L | TNT
对于TBinary treeLLeafNNode的红黑树。

在搜索时,每个节点都被定义为一对(颜色,值)。我想找到两件事。

  1. 我想将语法扩展为属性语法,检查是否满足红/黑树的条件。问题是我不知道应该如何在语法中添加红黑条件?
  2. 查找语法的合成和继承属性。

1 个答案:

答案 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开始。