让我有一些表达式为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
问题是:上面表达式的树会一样吗?如果没有,如何构建它?
答案 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:
(预购:F,B,A,D,C,E,G,I,H)
(按顺序:A,B,C,D,E,F,G,H,I)
(下订单:A,C,E,D,B,H,I,G,F)