是否可以构建一个后缀或前缀形式的树?

Is it possible to construct a tree of postfix or prefix form?

让我有一些表达为2*3/(2-1) +5*(4-1)。它是中缀符号。当然,我可以为这个表达式构造一棵你可以在图像上看到的树。 enter image description here

那么,我们把这个表达式写成后缀和前缀的形式。 后缀:2 3 * 2 1 - / 5 4 1 - * + 前缀:+ / * 2 3 - 2 1 * 5 - 4 1

问题是:以上表达式的树是否相同?如果没有,如何构建?

And the question is: a tree for above expressions will be the same?

是的,这是同一棵树 -- 不同的符号表示相同的计算。


表达式的不同写法正好对应同一棵树的不同traversals

  • 预购前缀符号

(预购: F, B, A, D, C, E, G, I, H)

  • 有序 中缀表示法

(按顺序:A、B、C、D、E、F、G、H、I)

  • post-order for postfix notation

(post-顺序:A、C、E、D、B、H、I、G、F)

这是从前缀表示构造树的粗略草图(将前缀表示法视为数字和运算符的流):

preocedure buildTree(prefix):
    c := first item of prefix
    if c is a number then
        return a tree node containing the number
    else
        create a tree node t with c (an operator in this case)
        t.left := buildTree(rest of prefix)
        t.right := buildTree(rest of prefix)
        return t

您应该使用树的前缀表示来调用此方法。该方法将从中递归构建子树。

您也可以编写类似的方法从后缀表示构建树。您需要调整此算法以从右端开始并首先构建右子树。

有很多关于如何构建表达式树的资源。 wiki这里有很好的参考。

这个想法是,当你遍历每个字符时,例如,后缀表达式。

  • 如果该字符是一个操作数,则将其压入堆栈

  • 如果角色是一个运算符,那么你从栈中弹出两个元素,使它们成为当前运算符的子元素,然后将运算符压入栈中。

循环终止后,您将在堆栈中得到一个元素作为树的根。