0

我目前正在研究一个表达式树项目,该项目从用户那里接收一个后缀表达式(即 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()+" "; 的顺序。

我尝试过以各种方式重新格式化这些方法,但每次我最终都会遇到相同的错误。我知道整棵树都不为空,但我错过了什么?

任何帮助将不胜感激。

4

0 回答 0