邮政订单遍历公式

时间:2010-10-14 01:33:27

标签: data-structures tree-traversal

在数据结构中,我按顺序转换并预先将公式转换为树。但是,我对后期订单不太满意。

对于给定的公式x y z + a b - c * / -

我想出了

                   -
                 /   \
                *     / (divide)
               / \    / \   
              x  +    -  c
                / \  /\
               y  z a  b 

在大多数情况下,这似乎很合适,除了左子树中的*是套牌中的小丑。在后期顺序遍历中,最后一个字符是树的顶部节点,其他所有字符都向下分支。现在,我将/和*运算符表示它们应该位于相反的节点上。但是,当遍历树时,除了*之外,所有内容都适合,因为左子树必须处理根之前的节点,然后切换到右子树。

赞赏正确的方向。

2 个答案:

答案 0 :(得分:3)

按顺序排列。首先,再次写出整个堆栈:

x y z + a b - c * / -

现在,从左侧开始,查找第一个运算符。将它和前两个操作数替换为堆栈中的一个有序位:

x(y + z)a b - c * / -

继续下一个操作员:

x(y + z)(a-b)c * / -

然后是下一个:

x(y + z)((a-b)* c)/ -

x((y + z)/((a-b)* c)) -

x - ((y + z)/((a-b)* c))

现在,要使它成为一棵树,只需从中间开始(你已经知道它是原始堆栈中的最后一个元素),并从中向外挂起带括号的子表达式。

答案 1 :(得分:0)

实际上,编写一个解析后序表达式的程序要比按顺序解析它的程序更容易,因为你不必检查操作的优先级。

尝试这样:制作一个堆栈,并在找到它们时添加操作数(从左到右)。找到操作时,从堆栈中提取它所需的操作数数量并放回一棵小树。完成后,堆栈中只有一个结果:最终图表。

例如:

x y z +  ->  x   +
               /  \
              y    z