2014-06-25 30 views
0

我写了一个通用的树像这样实现:如何打印普通的树

public class Tree { 

    private Node root; 
    private Node ultimo; 
    private Node padre; 
    private String nome; 
    private String messaggio; 

    public Tree() { 
     root = null; 
     ultimo = root; 
     padre = root; 
    } 

    public Node getRoot() { 
     return root; 
    } 

    public void setRoot(Node root) { 
     this.root = root; 
    } 

    public Node getUltimo() { 
     return ultimo; 
    } 

    public Node getPadre() { 
     return padre; 
    } 

    public String getNome() { 
     return nome; 
    } 

    public String getMessaggio() { 
     return messaggio; 
    } 

    public void setUltimo(Node ultimo) { 
     this.ultimo = ultimo; 
    } 

    public void setPadre(Node padre) { 
     this.padre = padre; 
    } 

    public void setNome(String nome) { 
     this.nome = nome; 
    } 

    public void setMessaggio(String messaggio) { 
     this.messaggio = messaggio; 
    } 

    public ArrayList<Node> getPreOrderTraversal() { 
     ArrayList<Node> preOrder = new ArrayList<Node>(); 
     buildPreOrder(root, preOrder); 
     return preOrder; 
    } 

    public ArrayList<Node> getPostOrderTraversal() { 
     ArrayList<Node> postOrder = new ArrayList<Node>(); 
     buildPostOrder(root, postOrder); 
     return postOrder; 
    } 

    private void buildPreOrder(Node node, ArrayList<Node> preOrder) { 
     preOrder.add(node); 
     for(Node child : node.getChildren()) { 
      buildPreOrder(child, preOrder); 
     } 
    } 

    private void buildPostOrder(Node node, ArrayList<Node> preOrder) { 
     for(Node child : node.getChildren()) { 
      buildPreOrder(child, preOrder); 
     } 
     preOrder.add(node); 
    } 

    public void print(String indent) { 
     if(root == null) { 
      System.out.println("Empty tree."); 
      return; 
     } 
     if(getPadre() != null) 
      getPadre().printNode(); 
     getUltimo().printNode(); 
    } 
} 

现在我想编写一个方法,让我打印整个树(或图形形式的graphviz或通过提示)。现在,我写的print()方法只打印树中最后一个插入的节点和他的父亲。

我想打印整棵树我应该使用print方法递归,但怎么样? 非常感谢您

回答

0

您将需要使用树遍历算法之一。 Here就是例子。

+0

但是一个二叉树的例子,虽然我有一个通用的树..与二叉树是“简单”,因为你只是调用预订左子上的方法,然后在右..但与一个你做的节点列表? – user3602008

+0

从这个例子看来,每个节点似乎都有两个名为ultimo和padre的孩子。因此,对于这样的树木,我相信我们可以应用二叉树算法。 –

0

最近,我一直在打印通用树并实现了一种方法。这是我的方法;

private String generateGenericVerbose(GenericTreeNode<?> node, String prefix, boolean isRightMost, boolean isLeftMost, StringBuilder sb) { 
     int halfSize = (node.getChildrenCount() + 1)/2; 
     List<GenericTreeNode<?>> children = new ArrayList<>(node.getChildren()); 
     for (int i = children.size() - 1 ; i >= halfSize; i--) { 
      GenericTreeNode<?> child = children.get(i); 
      generateGenericVerbose(child, 
        prefix + (isRightMost && !isLeftMost ? " " : "│ "), 
        child.isRightMostChild() ? true : false, 
        child.isLeftMostChild() ? true : false, 
        sb); 
     } 
     sb.append(prefix). 
     append(isRightMost && isLeftMost ? "└── " : ""). 
     append(isRightMost && !isLeftMost ? "┌── " : ""). 
     append(isLeftMost && !isRightMost ? "└── " : ""). 
     append(!isRightMost && !isLeftMost ? "├── " : ""). 
     append(node.toString()). 
     append("\n"); 
     for (int i = halfSize - 1; i >= 0; i--) { 
      GenericTreeNode<?> child = children.get(i); 
      generateGenericVerbose(children.get(i), 
        prefix + (isLeftMost ? " " : "│ "), 
        child.isRightMostChild() ? true : false, 
        child.isLeftMostChild() ? true : false, 
        sb); 
     } 
     return sb.toString(); 
    } 

和样本树;

GenericTree<String> gt = new DefaultGenericTree<String>("2"); 
     gt.insert("2", "7"); 
     gt.insert("2", "5"); 
     gt.insert("2", "19"); 
     gt.insert("2", "18"); 
     gt.insert("2", "17"); 
     gt.insert("2", "21"); 
     gt.insert("7", "3"); 
     gt.insert("7", "6"); 
     gt.insert("6", "4"); 
     gt.insert("6", "11"); 
     gt.insert("5", "9"); 
     gt.insert("9", "8"); 
     gt.insert("8", "12"); 
     gt.insert("12", "13"); 
     gt.insert("13", "14"); 
     gt.insert("18", "22"); 
     gt.insert("18", "23"); 
     gt.insert("17", "24"); 
     gt.insert("5", "25"); 
     gt.insert("5", "26"); 
     gt.insert("5", "27"); 
     gt.insert("5", "28"); 
     gt.insert("12", "29"); 
     gt.insert("29", "30"); 
     gt.insert("24", "31"); 
     gt.insert("31", "32"); 
     gt.insert("31", "33"); 
     gt.insert("31", "34"); 

在开始时您应该调用像这样的方法;

generateGenericVerbose(node, "", false, false, new StringBuilder()); 

结果;

│ ┌── 21 
│ ├── 17 
│ │ └── 24 
│ │  │ ┌── 34 
│ │  └── 31 
│ │   ├── 33 
│ │   └── 32 
│ │ ┌── 23 
│ ├── 18 
│ │ └── 22 
├── 2 
│ ├── 19 
│ │ ┌── 28 
│ │ ├── 27 
│ ├── 5 
│ │ ├── 26 
│ │ ├── 25 
│ │ └── 9 
│ │  └── 8 
│ │   │ ┌── 29 
│ │   │ │ └── 30 
│ │   └── 12 
│ │    └── 13 
│ │     └── 14 
│ │  ┌── 11 
│ │ ┌── 6 
│ │ │ └── 4 
│ └── 7 
│  └── 3