我正在从事的这个项目要求用一串单一数字的操作数和运算符构造一个表达式树,这两个运算符和运算符都表示为char类型。我做了这个实现,并且到那时为止的程序都运行良好。我能够以正确的方式打印出有序,预排序和后遍历遍历。
最后一部分要求评估表达式树。参数是表达式树“ t”及其根“ root”。表达式树是((3 + 2)+(6 + 2)),它等于13。相反,我得到11作为答案。显然,我在这里缺少任何东西,除了把头撞在桌子上之外,我已经做了所有事情。
如果有人可以指出正确的方向,我将不胜感激。
((请注意,此时我仅测试加法,并且在使该方法起作用时将添加其他运算符。)
public int evalExpression( LinkedBinaryTree t, BTNode root ) {
if( t.isInternal( root ) ) {
int x = 0, y = 0, value = 0;
char operator = root.element();
if( root.getLeft() != null )
x = evalExpression(t, t.left( root ) );
if( root.getRight() != null )
y = evalExpression(t, t.right( root ) );
if( operator == '+' ) {
value = value + Character.getNumericValue(x) + Character.getNumericValue(y);
}
return value;
} else {
return root.element();
}
}
没有实际的树,您无法在任何方面帮助您。您是否尝试实际调试它以进行更改?
您知道,放置一些断点并逐步查看它的作用吗?
在“内部”情况下,从evalExpression调用获得的x和y值已经是整数,因此您不需要在那里调用Character.getNumericValue。我认为应该在“叶子”情况下发生。
我为您修复了它:
Public int evaluate(BSTNode node){
Int x=0, y=0, val=0;
char operator = node.getString().charAt(0);
If(node.getLeft()!=null)
x= evaluate(node.getLeft());
If(node.getRight()!=null)
x= evaluate(node.getRight());
If(operator== '+'){
val= x+y;
return val;
}
If(operator== '-'){
val= x-y;
return val;
}
If(operator== '*'){
val= x*y;
return val;
}
If(operator== '/'){
val= x/y;
return val;
}
return Integer.parseInt(node.getString());
}