【问题标题】:Expression Tree issues表达式树问题
【发布时间】:2015-04-28 18:14:37
【问题描述】:

我正在手工绘制表达式树,但我一直遇到一个我不明白的问题。

我对表达式树的理解,这可能是错误的,你选择一个根,制作树,然后如果你遍历树的前序、中序或后序,那就是对应的——修复你会得到的表达。

所以,如果我有...

中缀: A + B + C - D

前缀表达式看起来像:-++ABCD

后缀表达式看起来像:AB+C+D-

我的树看起来像这样......

                       +
                     /   \
                   +       -
                 /   \   /   \
                A     B C     D

现在,我假设您选择最明显的任何根并相应地制作树,所以我选择中间的+ 运算符。当我按顺序遍历树时,它会产生正确的表达式。 但是,当我预订时,答案是:++AB-CD 这是不正确的。后缀也不正确,在后序遍历树时答案是AB+CD-+

我犯了什么错误?

是我选择的根吗? 我从根及其后续孩子创建孩子的方法? 还是使用中缀表达式树不能总是找到后缀和前缀表达式?

【问题讨论】:

    标签: binary-tree expression-trees prefix postfix-notation infix-notation


    【解决方案1】:

    你不能只选择一个根。

    如果您认为您的运算符是left-associative,就像算术表达式通常所做的那样,那么A + B + C - D 等效于((A + B) + C) - D。这表明根是-,正确的树是:

          -
         / \
        +   D
       / \
      +   C
     / \
    A   B
    

    遍历这棵树会给你正确的前缀和后缀表达式。

    现在,整数加法是关联的,所以((A + B) + C) - D 将给出与(A + B) + (C - D) 相同的结果,但它不是相同的表达式。这可能是让你感到困惑的地方。

    【讨论】:

    • 假设我们有 A + B * C + D / E,它看起来像.....( A + (B * C) ) + (D/E)?
    • @FrankPalmasani 如果要加乘除法,还需要考虑operator precedence
    • 这更有意义。
    猜你喜欢
    • 2019-07-25
    • 2017-09-22
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2011-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多