如何打印通用树

时间:2014-06-25 17:22:21

标签: java tree

我写了这样一个通用树的实现:

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方法,但是如何? 非常感谢你

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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