2011-10-30 11 views
1

私はJavaで赤/黒のツリーを実装しています。ツリーが正しいかどうかを確認し、デバッグを簡単にするために、ツリーを標準出力にコピーする方法をコピー/貼り付けます。この方法は、プリントアウトであろう29, 42, 23, 47, 11, 4
:の入力シーケンスについて バイナリツリーを標準出力に出力するJava

これは実際にはほとんど想像赤/黒のツリーで

enter image description here

、単にないノード間のエッジを有します。
42これは小さな木のためだけで結構ですが、大きいために少し複雑になる等、

右黒子47及び左赤色子23(赤ノードは<と>で囲まれている)と黒根であります木。
今はルートが左側にあり、ツリーが右側に拡大しています。 ルートを最初に印刷してツリーを下に拡大して、そのようなツリーを印刷する方法があるかどうか疑問に思っていましたか?そのよう

:それは第二の画像のように表示しますので、私は、現在の方法を変更することができる方法 enter image description here

、または容易に入手できるような方法がない場合
、?

private static void printHelper(Node n, int indent) { 

    if (n.getRight() != null) { 
     printHelper(n.getRight(), indent + INDENT_STEP); 
    } 

    for (int i = 0; i < indent; i++) { 
     System.out.print(" "); 
    } 

    if (n.getColor() == BLACK) { 
     System.out.println(n.getValue()); 
    } else { 
     System.out.println("<" + n.getValue() + ">"); 
    } 

    if (n.getLeft() != null) { 
     printHelper(n.getLeft(), indent + INDENT_STEP); 
    } 
} 

、ノードとしてツリーのルートとインデントとして0と呼ばれている(とINDENT_STEPは4である):

これは、現在の方法です。

EDIT:これは赤/黒の木に特有の問題ではないと思います。私はこうしてタイトルから赤/黒を取り除き、私はバイナリツリーに置き換えます。

答えて

1

くそ、私は予想通り、これは動作するように得るためにとても近いです:

は、ここでのpythonの中からドットの赤と黒のツリーを作成する方法の一例です!なぜこれが依然として必要な結果に満たないのか誰にも分かりますか?

package tree; 

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class Tree { 

    private final static int BLACK = 1; 
    private final static int RED = 2; 
    private Tree left = null; 
    private Tree right = null; 
    private int color = BLACK; 
    private String value = ""; 

    Tree(final Tree left, final Tree right, final int color, final String value) { 
     this.left = left; 
     this.right = right; 
     this.color = color; 
     this.value = value; 
    } 

    Tree getLeft() { 
     return left; 
    } 

    Tree getRight() { 
     return right; 
    } 

    int getColor() { 
     return color; 
    } 

    String getValue() { 
     return value; 
    } 

    public static void main(String[] args) { 

     Tree leaf1 = new Tree(null, null, RED, "20"); 
     Tree leaf2 = new Tree(null, null, BLACK, "30"); 
     Tree leaf3 = new Tree(null, null, RED, "2"); 
     Tree leaf4 = new Tree(null, null, RED, "100"); 
     Tree leaf5 = new Tree(null, null, BLACK, "5"); 

     Tree middle1 = new Tree(leaf1, leaf2, RED, "40"); 
     Tree middle2 = new Tree(middle1, leaf3, BLACK, "200"); 
     Tree middle3 = new Tree(leaf4, leaf5, RED, "3"); 

     Tree root = new Tree(middle2, middle3, RED, "50"); 

     printTree(root); 

    } 

    static void printTree(final Tree t) { 

     final Map<Tree, Integer> widths = new HashMap<Tree, Integer>(); 
     final Map<Tree, Integer> offsets = new HashMap<Tree, Integer>(); 

     setWidths(widths, t); 

     setOffsets(offsets, widths, t, widths.get(t)/2); 

     final List<Tree> root = new ArrayList<Tree>(); 
     root.add(t); 
     printTree(offsets, root); 

    } 

    static int setWidths(final Map<Tree, Integer> widths, final Tree t) { 

     if(widths.containsKey(t)) 
      return widths.get(t); 

     int width = (t.getColor() == BLACK) ? t.getValue().length() 
        : t.getValue().length() + 2; 

     final Tree left = t.getLeft(); 
     final Tree right = t.getRight(); 

     if(left != null) 
      width += setWidths(widths, left); 
     if(right != null) 
      width += setWidths(widths, right); 

     widths.put(t, width); 

     return width; 

    } 

    static void setOffsets(final Map<Tree, Integer> offsets, final Map<Tree, Integer> widths, 
      final Tree t, final int offset) { 

     offsets.put(t, offset); 

     System.out.println("Parent offset for node " + t.getValue() + ", offset " + offset); 

     final Tree left = t.getLeft(); 
     final Tree right = t.getRight(); 

     if(left != null) 
      setOffsets(offsets, widths, left, offset - widths.get(left)/2); 
     if(right != null) 
      setOffsets(offsets, widths, right, offset + widths.get(right)/2); 

    } 

    static void printTree(final Map<Tree, Integer> offsets, final List<Tree> trees) { 

     if(trees.isEmpty()) 
      return; 

     final List<Tree> children = new ArrayList<Tree>(); 
     int linePos = 0; 

     for(int i = 0; i < trees.size(); ++i) { 

      final Tree t = trees.get(i); 

      int offset = offsets.get(t); 
      final char[] lead = new char[Math.max(offset - linePos, 0)]; 
      Arrays.fill(lead, ' '); 

      System.out.print(new String(lead)); 
      linePos += Math.max(offset, 0); 

      if(t.getColor() == RED) { 
       System.out.print(t.getValue()); 
       linePos += t.getValue().length(); 
      } else { 
       System.out.print("<" + t.getValue() + ">"); 
       linePos += t.getValue().length() + 2; 
      } 

      if(t.getLeft() != null) 
       children.add(t.getLeft()); 
      if(t.getRight() != null) 
       children.add(t.getRight()); 

     } 

     System.out.println(""); 

     printTree(offsets, children); 

    } 

} 
+0

私は自分のプロジェクトにコードを編集しましたが、今すぐテストしています。それは間違いなくそれが見える方法を見始める。私は修正が見つかった場合、これを更新したままにして、完全に動作するようにします。ありがとうございました! – Aerus

+0

これを後でもう一度撮るつもりです。私が思ったよりも実際には難しいです。 –

+0

私はまだコードを少し通り抜けていますが、あるノードの正しい子のサブツリーを印刷しなければならないと間違っているように見えます。したがって、ルートは正しく印刷され、彼の右の子は正しく印刷されますが、右の子のサブツリーは何とか左に移動します。 – Aerus

1

おそらく、より複雑なツリーを描画するために別の方法を使用することを検討することがあります。このための優れたツールは、ソフトウェアの一部であるdot languageです。 http://code.activestate.com/recipes/576817-red-black-tree/

+0

アア私はそれらを表現する他の方法を検討しましたが、すべて複雑になりましたが、実際は非常に面白くて簡単です。私はそれを試してみて、おそらく私の報告書の画像のためにそれを使用します。 – Aerus

関連する問題