Если вы уверены, что структура является деревом (узел не может иметь более одного родителя), это перечислит узлы в порядке глубины:
public static List<Node> returnAllNodes(Node node){
List<Node> listOfNodes = new ArrayList<Node>();
addAllNodes(node, listOfNodes);
return listOfNodes;
}
private static void addAllNodes(Node node, List<Node> listOfNodes) {
if (node != null) {
listOfNodes.add(node);
List<Node> children = node.getChildren();
if (children != null) {
for (Node child: children) {
addAllNodes(child, listOfNodes);
}
}
}
}
Если узлы могут иметь несколько родителей, измените первую строку addAllNodes на:
if (node != null && !listOfNodes.contains(node)) {
Алгоритм в ширину выглядит следующим образом:
public static List<Node> returnAllNodes(Node node){
List<Node> listOfNodes = new ArrayList<Node>();
if (node != null) {
listOfNodes.add(node);
for(int i = 0; i < listOfNodes.size(); ++i) {
Node n = listOfNodes.get(i);
List<Node> children = n.getChildren();
if (children != null) {
for (Node child: children) {
if (!listOfNodes.contains(child)) {
listOfNodes.add(child);
}
}
}
}
}
return listOfNodes;
}