表达式树打印

时间:2013-11-07 00:53:02

标签: java recursion nullpointerexception expression-trees

我正在研究一个表达式树项目,该项目接受用户的后缀表达式(即7 8 +)并将其存储在表达式树中;然后,程序应以典型的树格式打印树,并向用户显示打印中缀,前缀或后缀格式的选项。

截至目前,似乎我的树正在被正确实例化,但每次我尝试打印它时,格式稍微关闭,每个操作符/操作数都是重复的。所以,如果输出看起来像

       -
    6    5

最终看起来像

       - -

  6 5 6 5

最重要的是,每当我尝试打印出一个中缀/前缀/后缀格式时,我会遇到几个空指针异常 - 以及我编写代码的方式,我不知道这是怎么回事。 / p>

打印树的主要方法如下:

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;
    }

预订和后序的方法几乎相同,它们只是改变结果的顺序+ = root.getElement()+“”;

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

非常感谢任何帮助。

0 个答案:

没有答案