邮政订单遍历公式

时间:2013-08-03 18:40:32

标签: data-structures tree tree-traversal

我被赋予2 y 5 1 4 3 - * - * +,并被要求对其进行评估,然后绘制等效的表达式树。我之前没有做过任何相关的工作,有人能说明你要采取的步骤来解决这类问题吗?

我看过:Post order traversal of a formula 并且对如何得出答案感到困惑。

3 个答案:

答案 0 :(得分:1)

Post order traversal of a formula的答案说找到第一个运营商。在你的情况下它是' - '。他描述的第二步是将它放在前两个操作数之间。 在你的情况下,这两个操作数是4和3(它们直接在' - '之前)。因此,此步骤后的公式变为:

2 y 5 1 (4-3) * - * +

请记住,表达式(4-3)现在是一个操作数。

我们再次对这个公式应用这些步骤。我们看到第一个运算符现在是''。 ''之前的两个操作数是1和(4-3)。公式变为:

2 y 5 (1*(4-3)) - * +

现在你可以申请这个,直到所有的操作员都不见了。

我不会继续提供更多步骤,因为这可能是一个功课问题。不过我觉得很清楚吗?

答案 1 :(得分:1)

您获得的是后缀表达式。众所周知,这些东西是根据以下规则用堆栈评估的:

  

从左到右工作,遇到值时,按下它。遇到操作符时,弹出前两个值,应用操作,然后将结果推回。

所以你的表达评估会像这样进行

2               (push 2)
2 y             (push y)
2 y 5           (push 5)
2 y 5 1         (push 1)
2 y 5 1 4       (push 4)
2 y 5 1 4 3     (push 3)
2 y 5 1 1       (pop 3, pop 4, push 4-3)
2 y 5 1         (pop 1, pop 1, push 1*1)
2 y 4           (pop 1, pop 5, push 5-1)
2 4y            (pop 4, pop y, push y*4)
2+4y            (pop 4y, pop 2, push 2+4y)

你的答案是堆栈上留下的价值。

现在,您还询问了生成树。要生成树,而不是在找到运算符时计算表达式,而是通过构造以操作符为根的树片段来“应用”运算符,并将弹出的树片段作为子元素。

推了之后

2 y 5 1 4 3

你看到一个-,所以弹出4和3然后你推回这个结构

  -
 / \
4   3

接下来你看到*所以你弹出顶部树片段和它下面的片段,这实际上是一个由单个节点组成的树片段

1

所以它看起来像

   *
 /   \
1     -
     / \
    4   3

你应该可以从这里拿走它。

答案 2 :(得分:1)

正如你所链接的问题novalis所述,扫描第一个运算符和前两个操作数,然后用括号中更熟悉的表达式替换该组,即

如果你有:

op1 op2 operator
4    3     -

这变为:

(op1 operator op2)
(4      -      3 )

所以,继续......

2  y  5  1  4  3 -  *  -  *  +

2  y  5  1 (4 - 3)  *  -  *  +

2  y  5  (1 * (4 - 3)) -  *  +

以类似的方式继续构建树。扫描第一个操作符并创建一个小树:

  -
 / \
4   3

然后,每个新操作数都是新树的顶级节点:

   *
 /   \
1     -
     / \
    4   3

然后:

   -
  / \
 5   *
    / \
   1   -
      / \
     4   3