我目前正在研究一个表达式树项目,该项目从用户那里接收一个后缀表达式(即 7 8 +)并将其存储在表达式树中;然后程序应该以典型的树格式打印树,并为用户提供打印中缀、前缀或后缀格式的选项。
截至目前,我的树似乎已被正确实例化,但每次我尝试打印它时,格式都会略有偏差,并且每个运算符/操作数都是重复的。所以,如果输出应该看起来像
-
6 5
它最终看起来像
- -
6 5 6 5
最重要的是,每当我尝试打印出中缀/前缀/后缀格式时,都会遇到几个空指针异常——而我编写代码的方式,我什至不知道这怎么可能。
打印出树的主要方法如下:
public String toString() {
String result = "";
int printDepth = getHeight();
int possibleNodes = (int)Math.pow(2, printDepth+1);
int countNodes = 0;
UnorderedListADT<BTNode<ExpressionTreeNode>> nodes = new UnorderedList<BTNode<ExpressionTreeNode>>();
UnorderedListADT<Integer> levelList = new UnorderedList<Integer>();
BTNode<ExpressionTreeNode> current;
nodes.addToRear(root);
Integer currentLevel = 0;
Integer previousLevel = -1;
levelList.addToRear(currentLevel);
while(countNodes < possibleNodes) {
countNodes += 1;
current = nodes.removeFirst();
currentLevel = levelList.removeFirst();
if(currentLevel>previousLevel) {
result += "\n\n";
previousLevel = currentLevel;
for(int a=0;a<((Math.pow(2, (printDepth-currentLevel+1))-1));a++) {
result += " ";
}
}
if(current!=null) {
result += (current.getElement()).toString()+" ";
nodes.addToRear(current.getLeft());
levelList.addToRear(currentLevel+1);
nodes.addToRear(current.getRight());
levelList.addToRear(currentLevel+1);
}
else {
nodes.addToRear(null);
levelList.addToRear(currentLevel+1);
nodes.addToRear(null);
levelList.addToRear(currentLevel+1);
result += " ";
}
}
return result;
}
以及以各种其他格式打印出树的方法......
public String printInorder() {
String result = "";
if(getLeft()!=null)
getLeft().printInorder();
result+= root.getElement()+" ";
if(getRight()!=null)//one null pointer occurs here
getRight().printInorder();//another occurs here
return result;
}
preorder 和 postorder 的方法几乎相同,它们只是改变了 result+=root.getElement()+" "; 的顺序。
我尝试过以各种方式重新格式化这些方法,但每次我最终都会遇到相同的错误。我知道整棵树都不为空,但我错过了什么?
任何帮助将不胜感激。