Java 计算二叉表达式树的值
我有一个二叉树构造函数,它将在字符串中使用前缀符号,并最终打印出如下内容:Java 计算二叉表达式树的值,java,recursion,binary-tree,expression-trees,Java,Recursion,Binary Tree,Expression Trees,我有一个二叉树构造函数,它将在字符串中使用前缀符号,并最终打印出如下内容: |-- * |-- 2 |-- + |-- 4 |-- + |-- 6 |-- 7 此树的前缀表示法为:(*2(+4(+67))) 该值应为:2*17=34。我知道在计算这些树时会用到堆栈,但我不知道该怎么做 我的想法是,有两个堆栈。一个用于运算符,一个用于操作数。当输入两个操作数时,最后一个运算符被取出,新操作数被放在何处
|-- *
|-- 2
|-- +
|-- 4
|-- +
|-- 6
|-- 7
此树的前缀表示法为:(*2(+4(+67)))
该值应为:2*17=34。我知道在计算这些树时会用到堆栈,但我不知道该怎么做
我的想法是,有两个堆栈。一个用于运算符,一个用于操作数。当输入两个操作数时,最后一个运算符被取出,新操作数被放在何处
此外,我需要获取上面的树,并返回后缀、中缀和前缀符号。每次我尝试这样做时,它都会吐出一个前缀符号。据我所知,不必有两个堆栈。如果我没记错的话,树的求值算法可以递归实现,也可以通过堆栈实现——只要堆栈顶部是运算符,就用相应运算表达式的值替换堆栈顶部。我相信这种方法与术语的所谓“波兰符号”有关。这真的很容易:
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
}
}
同样,对于印刷而言。前缀的意思是,首先打印操作符,然后打印左子树,然后打印右子树。后缀的意思是:首先是左子树,然后是右子树,然后是运算符
只有中缀有点复杂,因为您可能需要在括号中打印子应力