2016-04-09 6 views
1

Я строю выражение в двоичном дереве каждый раз, когда он катится по циклу, создавая новое дерево в каждом конце «)» и выталкивая эти операторы/операнды в стек, чтобы выталкиваться обратно в один полный двоичное дерево.Построение двоичного дерева

Мой метод сборки:

package lab5; 

import net.datastructures.*; 

public class Expression<T> { 

/** Contain Linked Tree and Linked Stack instance variables **/ 
LinkedBinaryTree<T> tree; 
LinkedStack<LinkedBinaryTree<T>> stack; 


public Expression() { 
    tree = new LinkedBinaryTree<T>(); 
    stack = new LinkedStack<LinkedBinaryTree<T>>(); 

} // end constructor 

public LinkedBinaryTree<T> buildExpression (String expression) {// LinkedBinaryTree<T> is a type of LinkedBinaryTree 
    // major TODO to implement the algorithm] 
    LinkedBinaryTree<T> operand, op1, op2; 
    LinkedStack<LinkedBinaryTree<T>> newStack = new LinkedStack<LinkedBinaryTree<T>>(); 
    String symbol; 

    int i = 0; 
    int len = expression.length(); 

    for (i = 0; i < len; i++) { 
     symbol = expression.substring(i, i+1); 

     if ((!symbol.equals ("(")) && (!symbol.equals (")"))) { 
      operand = new LinkedBinaryTree<T>(); 
      operand.addRoot((T)symbol); 
      newStack.push(operand); 
     } else if (symbol.equals ("(")){ 
      continue; 
     } else { 
      op2 = newStack.pop(); 
      operand = newStack.pop(); 
      op1 = newStack.pop(); 
     tree.attach(operand.root(), op1, op2); 
     newStack.push(tree); 
     } 
    } 
    tree = newStack.pop(); 
    return tree; 

} // end method buildExpression 

}

Мой Тест:

package lab5; 
import net.datastructures.*; 

public class ExpressionTest { 

/** 
* @param args 
* @throws EmptyTreeException 
*/ 

/** Paranthesize is code fragment 8.26 pg. 346 **/ 

/** evaluateExpression method apart of LinkedBinaryTree class in net.datastructures **/ 

public static void main(String[] args) { 
    // declare local variables/objects 
      String s = new String(); 
      String exp = "((((3+1)x3)/((9-5)+2))-((3x(7-4))+6))"; //-13 
      Expression<String> expression = new Expression<String>(); 

      // print the expression string 
      System.out.printf ("The original Expression String generated via printf: %s", exp); 

      // create the tree using the 'stub' method 
      // i.e. it does nothing 
      LinkedBinaryTree<String> tree = expression.buildExpression (exp); 

      // use Object.toString simply to print its reference 
      System.out.printf ("\n\nThe Tree: %s\n", tree); 

    } 

} 

Я получаю NullPointerException, и я не знаю, почему. Нужно ли мне «Попробовать», а затем пропустить ошибку?

+0

Вы должны использовать отладчик, чтобы проверить, где и почему у вас есть ошибка. – ekeith

+0

Это приостановление запуска приложения из-за корня дерева. Он останавливается после t1.root.setParent (node) в LinkedBinaryTree.class, который я использую, чтобы захватить мою инициализацию объекта LinkedBinaryTree. Это отдельно от net.datastructures, который был предоставлен автором книги, которую я читал. В книге говорится, что если я использую addRoot (элемент), произойдет ошибка, если дерево не пустое. –

+0

Вы устанавливаете условия, чтобы поймать эту ошибку? если вы этого не сделали, вы можете сказать это в методе addRoot (element) 'if (root == null) {// addRootElement;} else {// вернуть сообщение об ошибке, указывающее, что уже есть корень – ekeith

ответ

1

Ошибка, вероятно, связана с проверкой на '(' (одинарные кавычки) вместо "(" (двойные кавычки) в symbol.equals ('('). Вы сравниваете строку с символом, который никогда не будет равным.

Возможно, также stack не инициализирован? Он должен быть локальным до buildExpression().

Обратите внимание, что ваш фрагмент кода не будет компилироваться:

  • stack не определен
  • symbol не определен

КСТАТИ: buildExpression() может быть статическим, что бы избежать пустой неиспользованными распределение выражений в основном.

Проверка на "(" в первую очередь позволит избежать проверки на "(" дважды.

+0

Извините, я так долго реагировал. Хорошо, поэтому я обновил код buildExpression выше. Я все равно получаю ту же ошибку NullPointerException. Вот ошибка: 'Исходная строка выражения, сгенерированная с помощью printf: (((3 + 1) x3)/((9-5) +2)) - ((3x (7-4)) + 6)) Исключение in thread "main" java.lang.NullPointerException' –

+0

Какова трассировка стека для выражения? –

+0

Я не знаю, что вы имеете в виду. –

Смежные вопросы