我正在手工绘制表达树,我一直遇到一个我不明白的问题。
我对表达式树的理解,可能是错误的,你选择一个根,制作树,然后如果你遍历树预订,有序或后序,那就是相应的 - 修复你会得到的表达。
所以,如果我有......
缀:
A + B + C - D
前缀表达式如下所示:-++ABCD
,后缀表达式如下:AB+C+D-
我的树看起来像这样......
+
/ \
+ -
/ \ / \
A B C D
现在,我假设您选择了最明显的根,并相应地生成树,因此我选择了中间的+
运算符。当我按顺序遍历树时,它会生成正确的表达式。
但是,当我按预订遍历时,答案是:++AB-CD
这是不正确的。后缀也不正确,在后续遍历树时答案为AB+CD-+
。
我犯了什么错误?
这是我选择的根吗? 我从根和他们后来的孩子创造孩子的方法? 或者是否使用中缀表达式树不能始终找到后缀和前缀表达式?
答案 0 :(得分:1)
您无法选择根。
如果您认为您的运算符为left-associative(通常用于算术表达式),则A + B + C - D
等同于((A + B) + C) - D
。这表明根是-
,正确的树是:
-
/ \
+ D
/ \
+ C
/ \
A B
遍历此树将为您提供正确的前缀和后缀表达式。
现在,整数加法是关联的,因此((A + B) + C) - D
会给你与(A + B) + (C - D)
相同的结果,但它不是同一个表达式。这可能让你很困惑。