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()+" "; の順序を変更するだけです。

これらのメソッドをあらゆる方法で再フォーマットしようとしましたが、毎回同じエラーが発生します。ツリー全体がnullではないことはわかっていますが、何が欠けていますか?

どんな助けでも大歓迎です。

4

0 に答える 0