import java.util.ArrayList;
import java.util.List;
public class ExpressionTree {
List<String> expArray = new ArrayList<String>();
ExpressionTreeNode root;
ExpressionTreeNode curNode;
ExpressionTreeNode left;
ExpressionTreeNode right;
String element;
public ExpressionTree(String prefixExpression) {
String[] temp = prefixExpression.split(" ");
for (int i = 0; i < temp.length; i++) {
expArray.add(temp[i]);
}
root = createExpressionTree(expArray);
System.out.println(root);
}
private ExpressionTreeNode createExpressionTree(List<String> prefixExpression) {
element = prefixExpression.get(0);
prefixExpression.remove(0);
if (isNumeric(element)) {
return new Leaf(Double.parseDouble(element));
} else {
left = createExpressionTree(prefixExpression);
right = createExpressionTree(prefixExpression);
}
return new ExpressionTreeNode(left, right, element);
}
private static boolean isNumeric(String str) {
try {
double d = Double.parseDouble(str);
} catch(NumberFormatException nfe) {
return false;
}
return true;
}
}
这是我的代码,我想在给出像* + 5 4 - 3/2的表达式时返回表达式树。我得到的输出是这样的:
1
|\
2 1
/\
2 1
/\
2 1
当我想要的时候:
*
/\
+ -
/\ /\
5 4 3 /
/\
2 1
任何提示?为什么我树的唯一元素是表达式的最后两个元素?我觉得我错过了一些明显的东西。
答案 0 :(得分:1)
您正在使用字段存储表达式节点程序集的临时结果。这些会在您正在使用的createExpressionTree(...)
的递归调用中被覆盖。
如果修改方法以使用局部变量作为临时值,那么一切都应该正常工作(您也可以从类定义中删除字段)。
private ExpressionTreeNode createExpressionTree(List<String> prefixExpression) {
String element = prefixExpression.get(0);
prefixExpression.remove(0);
if (isNumeric(element)) {
return new Leaf(Double.parseDouble(element));
}
ExpressionTreeNode left = createExpressionTree(prefixExpression);
ExpressionTreeNode right = createExpressionTree(prefixExpression);
return new ExpressionTreeNode(left, right, element);
}