package net.pechorina.kontempl.data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
public class GenericTree<T> {
static final Logger logger = LoggerFactory.getLogger(GenericTree.class);
private List<GenericTreeNode<T>> children;
public GenericTree() {
super();
children = new ArrayList<>();
}
public List<GenericTreeNode<T>> getChildren() {
return children;
}
public void setChildren(List<GenericTreeNode<T>> children) {
this.children = children;
}
public List<GenericTreeNode<T>> listAllChildren() {
List<GenericTreeNode<T>> l = new ArrayList<>();
//List<GenericTreeNode<T>> rootNodes = this.getChildren();
// logger.debug("Found root nodes: " + rootNodes.size());
//int i = 0;
for (GenericTreeNode<T> child : this.getChildren()) {
//i++;
l.add(child);
List<GenericTreeNode<T>> childList = auxiliaryListAllChildren(child);
// logger.debug("Found " + childList.size() + " children for root node #" + i);
l.addAll(childList);
}
return l;
}
public List<GenericTreeNode<T>> auxiliaryListAllChildren(GenericTreeNode<T> node) {
List<GenericTreeNode<T>> l = new ArrayList<>();
for (GenericTreeNode<T> child : node.getChildren()) {
l.add(child);
List<GenericTreeNode<T>> childList = auxiliaryListAllChildren(child);
l.addAll(childList);
}
return l;
}
public int getNumberOfNodes() {
int numberOfNodes = 0;
for (GenericTreeNode<T> child : this.getChildren()) {
numberOfNodes += auxiliaryGetNumberOfNodes(child);
numberOfNodes++; // add this child as well
}
return numberOfNodes;
}
private int auxiliaryGetNumberOfNodes(GenericTreeNode<T> node) {
int numberOfNodes = node.getNumberOfChildren();
for (GenericTreeNode<T> child : node.getChildren()) {
numberOfNodes += auxiliaryGetNumberOfNodes(child);
}
return numberOfNodes;
}
public boolean isEmpty() {
return this.getChildren().isEmpty();
}
public int getNumberOfChildren() {
return this.getChildren().size();
}
public boolean hasChildren() {
return (getNumberOfChildren() > 0);
}
public void addChild(GenericTreeNode<T> child) {
this.getChildren().add(child);
}
public void removeChildAt(int index) throws IndexOutOfBoundsException {
children.remove(index);
}
public void removeChildren() {
this.children = new ArrayList<>();
}
}