2017-12-07 15 views
1

私はノードを追加するときとコンソールに順番にツリーを印刷するときに完全に機能する私自身のノードで最初からバイナリ検索ツリーを作った。しかし、私はtoStringメソッドを稼働させるのに1時間半かかることがあります。toString toString

私はtoStringメソッドをMakeStringに変更しました。これは、比較可能な型のデータを文字列に変換するときに混乱していると思ったからです。私は、メソッドを1つのノードまたはオブジェクト形式で返すことができますが、文字列形式のツリー全体を返すことはできません。 printInOrder()メソッドは完全に機能するので、なぜ私のMakeString()メソッドはありませんか?

public void printInOrder(){ 

    if (left != null) left.printInOrder(); 

    System.out.println(data); 

    if (right != null) right.printInOrder(); 
} 

public String MakeString(){ 

    String OrderedTree; 
    StringBuilder sb = new StringBuilder(); 
    if (data == null) return "Tree is empty"; 

    if (left != null) left.MakeString(); 

    sb.append(data); 

    if (right != null) right.MakeString(); 
+0

クラス全体を貼り付けてください。また、あなたは 'left.MakeString()'の結果を使用していません。 –

+0

また、あなたが実際にここにどのようなテキスト出力を表示してください。コンソールにバイナリツリーを印刷することは、コードに関係なく私にとって挑戦的なように見えます。 –

+0

最後の行がありませんが、単にsb.toString()を返します。 – Matt

答えて

1

再帰の途中で何かを保存する必要がある場合は、パラメータとして渡す必要があります。これは、最初の呼び出しを準備する必要がないか、または再帰の前または後に何かをする必要がないようにするために、しばしば一対のメソッドになります。

あなたのケースでは、再帰の前に作成する必要があるStringBuilderを使用しており、全体にわたって保存された後で使用されます。

例:

public String MakeString() { 
    if (data == null) 
     return "Tree is empty"; 

    StringBuilder sb = new StringBuilder(); 

    MakeString(sb); 

    return sb.toString(); 
} 

private void MakeString(StringBuilder sb) { 
    if (left != null) 
     left.MakeString(sb); 

    sb.append(data); 

    if (right != null) 
     right.MakeString(sb); 
} 
+0

それはとてもスムーズに動作します!私は今朝起きていましたが、ファイルに印刷してファイルから読み込んでいました。 2つの方法!完璧、ありがとう! – Matt