Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 计算二叉表达式树的值_Java_Recursion_Binary Tree_Expression Trees - Fatal编程技术网

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
    }
}
同样,对于印刷而言。前缀的意思是,首先打印操作符,然后打印左子树,然后打印右子树。后缀的意思是:首先是左子树,然后是右子树,然后是运算符

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