题目地址:
https://leetcode.com/problems/design-an-expression-tree-with-evaluate-function/
给定一个后缀表达式,实现建立表达式树的方法;并设计一个类去extend给定的Node类,并实现evaluate()方法去计算当前Node所代表的子树的表达式值。
后缀表达式的解析是比较容易的。至于evaluate方法,可以用递归实现。如果当前节点是数值则直接返回数值,否则递归计算左右子树,再计算树根的运算,最后返回。代码如下:
import java.util.Deque;
import java.util.LinkedList;
public class TreeBuilder {
Node buildTree(String[] postfix) {
Deque<Node> stack = new LinkedList<>();
for (int i = 0; i < postfix.length; i++) {
String s = postfix[i];
if (Character.isDigit(s.charAt(0))) {
stack.push(new TreeNode(s));
} else {
Node right = stack.pop(), left = stack.pop();
TreeNode root = new TreeNode(s);
root.left = left;
root.right = right;
stack.push(root);
}
}
return stack.peek();
}
}
class TreeNode extends Node {
public TreeNode(String val) {
this.val = val;
}
@Override
public int evaluate() {
if (Character.isDigit(val.charAt(0))) {
return Integer.parseInt(val);
}
int left = this.left.evaluate(), right = this.right.evaluate();
switch (val) {
case "+": return left + right;
case "-": return left - right;
case "*": return left * right;
case "/": return left / right;
}
return 0;
}
}
abstract class Node {
public abstract int evaluate();
// define your fields here
String val;
Node left, right;
}
时间复杂度 O ( n ) O(n) O(n),空间 O ( h ) O(h) O(h), n n n为表达式树的节点数(也就是后缀表达式的字符串个数), h h h是表达式树的高度。