(In case you want to avoid the lengthy explanation, all I am looking for is a level order traversal for a generic-tree(n-ary tree) in java. The code supplied works and needs
Level-order traversal using Queue:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Objects;
import java.util.Queue;
import java.util.stream.Collectors;
public class LevelOrderTraversal {
static class Node {
int data;
Node children[];
Node(int data, int n) {
children = new Node[n];
this.data = data;
}
}
public static void main(String[] args) {
/*
1
/ | \
2 3 4
/ | \
5 6 7
*/
int n = 3;
Node root = new Node(1, n);
root.children[0] = new Node(2, n);
root.children[1] = new Node(3, n);
root.children[2] = new Node(4, n);
root.children[0].children[0] = new Node(5, n);
root.children[0].children[1] = new Node(6, n);
root.children[0].children[2] = new Node(7, n);
List> levelList = levelOrder(root);
for (List level : levelList) {
for (Integer val : level) {
System.out.print(val + " ");
}
System.out.println();
}
}
public static List> levelOrder(Node root) {
List> levelList = new ArrayList<>();
if (root == null) {
return levelList;
}
Queue queue = new LinkedList<>();
queue.add(root);
while (!queue.isEmpty()) {
int n = queue.size();
List level = new ArrayList<>();
while (n-- > 0) {
Node node = queue.remove();
level.add(node.data);
queue.addAll(Arrays.stream(node.children).filter(Objects::nonNull).collect(Collectors.toList()));
}
levelList.add(level);
}
return levelList;
}
}