#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. Следовательно, для таких деревьев, я полагаю, мы могли бы применить алгоритмы бинарного дерева.