2014-01-11 21 views
0

目前我有一個生成樹的程序。我使用https://stackoverflow.com/a/8948691來獲取樹的字符串輸出。對於這一點,我微微的鏈接改變了功能:除了使用System.out.println我重寫了代碼,以適應我的要求:顯示等寬字體的樹(如在記事本中)

public String getStringRepresentation(String prefix, boolean end, int position) 
    { 
     String retval = prefix + (position != -1? (end ? "└──" : "├──") + " " + position +(branches==null? "[" + content + "]" : ""):"") + "\r\n"; 
     if(branches != null)  
     { 
      for (int i = 0; i < branches.size() - 1; i++) { 
       retval += branches.get(i).getStringRepresentation(prefix + (end ? " " : "│ "), false,i); 
      } 
      if (branches.size() >= 1) { 
       retval += branches.get(branches.size() - 1).getStringRepresentation(prefix + (end ?" " : "│ "), true,branches.size() - 1); 
      } 
     } 
     return retval; 
    } 

的示例文本輸出將

├── 0 
│ ├── 0[F] 
│ └── 1 
│  ├── 0[V] 
│  └── 1[A] 
└── 1 
    ├── 0[D] 
    └── 1[S] 

這個字符串我展示以下:

JTextArea textarea = new JTextArea(infoMessage); 
     textarea.setFont(new Font("monospaced", Font.PLAIN, 14)); 
     JOptionPane.showMessageDialog(null, textarea); 

,看起來像這樣:

output of above code

(正如你所看到的,走線不應該的。)

+1

我們是否應該GESS你寫的代碼,並猜測輸出的樣子以及它應該是什麼樣子? –

+0

考慮向我們展示代碼,最好是[最小完整有效示例](http://stackoverflow.com/help/mcve)。請顯示所需的輸出和當前輸出。 –

+0

對不起,我更新了帖子 – Stefan

回答

0

我發現這個問題。顯然等寬字體不是正確的字體。如果我使用「consolas」(我的記事本使用的那個),則所有內容都正確顯示。

-2

這裏是Java代碼打印二叉樹象下面這樣:

 1 
    /\ 
/ \ 
    2  \ 
/\  3 
4 5 /\ 
     9 \ 
      8 
     /\ 
      6 7 

代碼:

package com.dsalgo; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.TreeMap; 

public class BinaryTreeNicePrint { 

public static void main(String[] args) { 
    Node a = new Node(1); 
    Node b = new Node(2); 
    Node c = new Node(3); 
    Node d = new Node(4); 
    Node e = new Node(5); 
    Node f = new Node(8); 
    Node g = new Node(6); 
    Node h = new Node(7); 
    Node i = new Node(9); 
    a.left = b; 
    a.right = c; 
    b.left = d; 
    b.right = e; 
    c.left = i; 
    c.right = f; 
    f.left = g; 
    f.right = h; 
    nicePrint(a); 
} 

public static void nicePrint(Node root) { 
    List<StringPoint> result = getStrings((getWidth(root) + 1)/2, 0, root); 
    TreeMap< Integer, List<StringPoint> > lines = new TreeMap< >(); 
    for (StringPoint s : result) { 
    if (lines.get(s.y) != null) { 
    lines.get(s.y).add(s); 
    } else { 
    List<StringPoint> l = new ArrayList< >(); 
    l.add(s); 
    lines.put(s.y, l); 
    } 
    } 
    for (List<StringPoint> l : lines.values()) { 
    System.out.println(flatten(l)); 
    } 
} 

private static String flatten(List<StringPoint> l) { 
    int x = 0; 
    StringBuilder sb = new StringBuilder(); 
    for (StringPoint s : l) { 
    sb.append(new String(new char[s.x - x]).replace('\0', ' ')); 
    sb.append(s.value); 
    x = sb.length(); 
    } 
    return sb.toString(); 
} 

private static int getWidth(Node root) { 
    int width = 0; 
    if (root.left != null) { 
    width += getWidth(root.left); 
    } 
    if (root.right != null) { 
    width += getWidth(root.right); 
    } 
    width += ("" + root.value).length(); 
    return width; 
} 

private static List<StringPoint> getStrings(int x, int y, Node root) { 
    List<StringPoint> result = new ArrayList<StringPoint>(); 
    result.add(new StringPoint(x - ("" + root.value).length()/2, y, "" 
    + root.value)); 
    if (root.left != null) { 
    int width = getWidth(root.left); 
    int i = 0; 
    for (; i < (width + 1)/2; ++i) 
    result.add(new StringPoint(x - i - 1, y + i + 1, "/")); 
    result.addAll(getStrings(x - i - 1, y + i + 1, root.left)); 
    } 
    if (root.right != null) { 
    int width = getWidth(root.right); 
    int i = 0; 
    for (; i < (width + 1)/2; ++i) 
    result.add(new StringPoint(x + i + 1, y + i + 1, "\\")); 
    result.addAll(getStrings(x + i + 1, y + i + 1, root.right)); 
    } 
    return result; 
} 

static class StringPoint { 
    Integer x; 
    Integer y; 
    String value; 

    StringPoint(int x, int y, String value) { 
    this.x = x; 
    this.y = y; 
    this.value = value; 
    } 

    @Override 
    public String toString() { 
    return "(" + x + "," + y + "," + value + ")"; 
    } 
} 

static class Node { 
    Node left; 
    Node right; 
    int value; 

    public Node(int value) { 
    this.value = value; 
    } 
} 
}