Как распечатать общее дерево

#java #tree

#java #дерево

Вопрос:

Я написал реализацию общего дерева следующим образом:

 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 рекурсивно, но как? Большое вам спасибо

Ответ №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 amp;amp; !isLeftMost ? "    " : "│   "), 
                    child.isRightMostChild() ? true : false,
                    child.isLeftMostChild()  ? true : false,
                    sb);
        }
        sb.append(prefix).
        append(isRightMost amp;amp; isLeftMost ? "└── " : "").
        append(isRightMost amp;amp; !isLeftMost  ? "┌── " : "").
        append(isLeftMost  amp;amp; !isRightMost ? "└── " : "").
        append(!isRightMost amp;amp; !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. Спасибо! было очень полезно для отладки присваивания с деревьями!

Ответ №2:

Вам нужно будет использовать один из алгоритмов обхода дерева. Вот пример.

Комментарии:

1. Но пример двоичного дерева, пока у меня есть общее дерево.. С двоичным деревом «просто», потому что вы просто вызываете метод для предварительного заказа левого дочернего элемента, а затем справа .. но со списком узлов, как вы это делаете?

2. Из примера кажется, что у каждого узла будет 2 дочерних элемента с именами ultimo и padre. Следовательно, для таких деревьев, я полагаю, мы могли бы применить алгоритмы бинарного дерева.