我写了这样一个通用树的实现:
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 :(得分: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就是一个例子。