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

时间:2017-04-25 15:38:03

标签: algorithm tree prefix postfix-notation

让我有一些表达式为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

问题是:上面表达式的树会一样吗?如果没有,如何构建它?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

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

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

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

  • 如果角色是操作符,则从堆栈中弹出两个元素并使其成为当前操作符的子级,然后将操作符推送到堆栈。

循环结束后,您最终会在堆栈上以单个元素作为树的根。

答案 2 :(得分:1)

  

问题是:上面表达式的树会一样吗?

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

编写表达式的不同方法仅对应于同一树的不同traversals

  • 预订用于前缀表示法

enter image description here

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

    中文记谱法
  • 按顺序

enter image description here

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

  • 订购后用于后缀表示法

enter image description here

(下订单:A,C,E,D,B,H,I,G,F)