我有一个二进制树构造函数,它将在字符串中使用前缀表示法,并最终打印出类似这样的内容:
|-- *
|-- 2
|-- +
|-- 4
|-- +
|-- 6
|-- 7
此树的前缀表示法是:(* 2(+ 4(+ 6 7))) 值应该是:2 * 17 = 34.我知道在计算这些树时会使用堆栈,但我不知道如何去做。
我的想法是,有两个堆栈。一个用于运算符,一个用于操作数。当放入两个操作数时,取出最后一个操作符,并将新操作数放在哪里?
此外,我需要获取上面的树,并返回后缀,中缀和前缀表示法。每次我尝试这样做时,都会吐出一个前缀表示法。
答案 0 :(得分:0)
根据我的理解,没有必要有两个堆栈。如果我没记错的话,用于评估树的算法可以递归地实现,也可以通过堆栈实现 - 只要堆栈顶部是运算符,用相应操作的表达式值替换堆栈顶部。我认为这种方法与该术语的所谓“波兰符号”有关。
答案 1 :(得分:0)
这很简单:
int eval(tree) {
if tree is just a number return that number
else {
l = eval(tree.left)
r = eval(tree.right)
return result of operation on l and r
}
}
同样,用于打印。前缀意味着,首先打印操作符,然后打印左子树,然后打印右子树。 Postfix意味着:首先是左子树,然后是右子树,然后是运算符。
只有中缀有点复杂,因为您可能需要在括号中打印该子句。