Search code examples
javatreeinfix-notationevaluate

Evaluating Expression Tree


I have the following code to evaluate my expression tree. But the problem is it gives me wrong answer. I have tested around and found that when I code

double left = (double) Character.digit((char) evaluateTree(t.left),
                    10);

left value gets equal to -1 which I believe the double value of '+'. When I call root.left (which is '+') and try to get its double value with the Character.digit(char) it gives me -1. Since my tree is like :

//My infix : (2+5)*7 MyPostfix : 25+7*

     *
    / \
   +   7
  / \
 2   5

Evaluate method :

public double evaluateTree(TreeNode t) {

if(root == null)
return 0;
if (Character.isDigit(t.ch))
    return (double)t.ch;
else {
    char c = t.ch;
    double left = (double) Character.digit((char) evaluateTree(t.left),
            10);    
    double right = (double) Character.digit(
            (char) evaluateTree(t.right), 10);

    //checks what to do for operators for example for '+' return left+right
    return evaluate(c, left, right);

}

}

Current result = -7.0

How do I fix this problem?

public double evaluate(char c, double left, double right) {

        double result = 0;
        switch (c) {
        case '+':
            result = left + right;
            break;
        case '-':
            result = left - right;
            break;
        case '*':
            result = left * right;
            break;
        case '/':
            result = left / right;
            break;
        case '%':
            result = left % right;
            break;
        }
        return result;

    }

Solution

  • Don't call Character.digit() on the result of evaluateTree(). evaluteTree() and evaluate() return a double, not a character that needs to be turned into a double. It's

    if (Character.isDigit(t.ch))
        return (double)t.ch;
    

    where you need the Character.digit() call.