从符号列表开始构建树

时间:2016-09-27 14:35:30

标签: algorithm recursion tree

我有一个符号列表,这些符号由格式良好的括号组成,我想生成一个像这样的树:

Tree with well formed parenthesis

叶节点是符号,非终端节点代表括号,我想在结构中存储它们。

有没有办法构建这棵树?

2 个答案:

答案 0 :(得分:0)

将整个公式分成直接后代的块应该很容易,而每个块都是格式良好的。使用嵌套级别计数:开括号增加级别,右括号降低级别,每当嵌套级别为0时,块之间就有边界。

这样,你可以转换

((a b) (c d)) e ((f g h) i)

进入其组成部分:

((a b) (c d))
e
((f g h) i)

对于每个部分,如果它包含多个符号,则递归地运行相同的算法。

答案 1 :(得分:0)

当然可以。首先,如果您实现一种语法,其中括号是语法收集标点符号(例如Python列表),您可以使用内置的评估函数将您的输入解析为理想的结构。

失败了...我相信以下只是前一个答案的更详细版本。步骤很简单(递归应该很简单,不是吗?):

  1. 如果输入是原子的,请将其设为叶节点并返回。
  2. 将给定列表拆分为左括号内每个内部0的元素。
  3. 对于此列表中的每个元素:

    3A。删除最外面的括号;

    3B。将括号数减少1;

    3c上。重申这个元素。

  4. 现在,让我们来看看你给出的例子。我忽略了原始的根节点文本,支持你在树中显示的结构:

    [(A ((B C) (D E)))(F G (H I L))]
    

    在每个级别,首先要做的是剥去最外面的括号(实际上是括号,在这种情况下。我不知道你为什么在外面有不同的符号)。

    (A ((B C) (D E)))(F G (H I L))
    

    现在,从前面开始,记住你有多少个开括号。

    (A ((B C) (D E)))(F G (H I L))
    1  23   2 3   2101    2     10
    
      

    注意:如果你需要为不平衡抛出语法错误,你就有了   不错的检查:最终计数必须为0,没有后续字符。

    无论你在中间有一个0,打破字符串(用^标记):

    (A ((B C) (D E)))  ^  (F G (H I L))
    1  23   2 3   210     1    2     10
    

    现在,重复发现您找到的每个元素。如果元素是原子的,那么它就是叶子节点。 如果要保存计数时间,请将计数作为例程的另一个参数。在递归时将它减少1。

                     ^
    A ((B C) (D E))     F G (H I L)
      12   1 2   10         1     0
    

    左侧有两个元素:叶子节点A和另一个我们重复的表达式:

    ((B C) (D E))
    12   1 2   10
    

    没有内部0,所以我们在整个列表中重复:

    (B C) (D E)
    1   0 1  0
    

    这分为两个列表,(B C)(D E)

    同样,根节点的右分支分为三个元素: F,G (H I L)。以同样的方式处理这些。