【问题标题】:Post order traversal of a formula公式的后序遍历
【发布时间】:2011-04-25 04:08:11
【问题描述】:

在数据结构中,我将按顺序和预排序公式转换为树。但是,我不太擅长后期处理。

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

我想出了

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

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

感谢您朝正确的方向轻推。

【问题讨论】:

    标签: data-structures tree-traversal


    【解决方案1】:

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

    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))

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

    【讨论】:

    • 谢谢,该解决方案似乎是最合适的。我在 x(y+z)((a-b)*c) 之后迷路了,不知道如何放置最后两个运算符。
    【解决方案2】:

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

    试试这个:创建一个堆栈,然后将找到的操作数添加到其中(从左到右)。当你找到一个操作时,从堆栈中提取它期望的操作数的数量并放回一棵小树。完成后,堆栈中将只有一个结果:最终图。

    例如:

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

    【讨论】:

    • 是的,我知道以编程方式执行它会更容易,但这是教科书中的一个问题,很有可能在期中出现。在没有为解决方案编写代码的情况下,我必须以老式的方式进行。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    相关资源
    最近更新 更多