/*
* Copyright 2007 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
/**
* @author ycoppel@google.com (Yohann Coppel)
*
* @param
* Object's type in the tree.
*/
public class Tree {
private T head;
private ArrayList> leafs = new ArrayList>();
private Tree parent = null;
private HashMap> locate = new HashMap>();
public Tree(T head) {
this.head = head;
locate.put(head, this);
}
public void addLeaf(T root, T leaf) {
if (locate.containsKey(root)) {
locate.get(root).addLeaf(leaf);
} else {
addLeaf(root).addLeaf(leaf);
}
}
public Tree addLeaf(T leaf) {
Tree t = new Tree(leaf);
leafs.add(t);
t.parent = this;
t.locate = this.locate;
locate.put(leaf, t);
return t;
}
public Tree setAsParent(T parentRoot) {
Tree t = new Tree(parentRoot);
t.leafs.add(this);
this.parent = t;
t.locate = this.locate;
t.locate.put(head, this);
t.locate.put(parentRoot, t);
return t;
}
public T getHead() {
return head;
}
public Tree getTree(T element) {
return locate.get(element);
}
public Tree getParent() {
return parent;
}
public Collection getSuccessors(T root) {
Collection successors = new ArrayList();
Tree tree = getTree(root);
if (null != tree) {
for (Tree leaf : tree.leafs) {
successors.add(leaf.head);
}
}
return successors;
}
public Collection> getSubTrees() {
return leafs;
}
public static Collection getSuccessors(T of, Collection> in) {
for (Tree tree : in) {
if (tree.locate.containsKey(of)) {
return tree.getSuccessors(of);
}
}
return new ArrayList();
}
@Override
public String toString() {
return printTree(0);
}
private static final int indent = 2;
private String printTree(int increment) {
String s = "";
String inc = "";
for (int i = 0; i < increment; ++i) {
inc = inc + " ";
}
s = inc + head;
for (Tree child : leafs) {
s += "\n" + child.printTree(increment + indent);
}
return s;
}
}