计算二进制表达式树的值

时间:2013-11-26 15:40:41

标签: java recursion binary-tree expression-trees

我有一个二进制树构造函数,它将在字符串中使用前缀表示法,并最终打印出类似这样的内容:

|-- *
    |-- 2
    |-- +
        |-- 4
        |-- +
            |-- 6
            |-- 7

此树的前缀表示法是:(* 2(+ 4(+ 6 7))) 值应该是:2 * 17 = 34.我知道在计算这些树时会使用堆栈,但我不知道如何去做。

我的想法是,有两个堆栈。一个用于运算符,一个用于操作数。当放入两个操作数时,取出最后一个操作符,并将新操作数放在哪里?

此外,我需要获取上面的树,并返回后缀,中缀和前缀表示法。每次我尝试这样做时,都会吐出一个前缀表示法。

2 个答案:

答案 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意味着:首先是左子树,然后是右子树,然后是运算符。

只有中缀有点复杂,因为您可能需要在括号中打印该子句。