思路:先把根节点root加进队列,然后遵循“队头弹出一个节点,队尾加入该节点的所有孩子,循环此操作直至所有节点都弹出”的规律,把弹出的节点依次存入结果列表,最后将列表返回。
public class Main {
public <E> List<List<TreeNode<E>>> levelOrder(TreeNode<E> x) {
//存放结果的list
List<List<TreeNode<E>>> res = new ArrayList<>();
//存放结果的第一行的list
List<TreeNode<E>> list = new ArrayList<>();
Queue<TreeNode<E>> queue = new LinkedList<>();
//标记上一行的最末节点
TreeNode<E> last = x;
//队列初始化
queue.add(x);
//标记最新加入队列的节点
TreeNode<E> nLast = null;
while (!queue.isEmpty()) {
TreeNode<E> peek = queue.peek();
//把即将弹出节点的子节点加入队列
if (peek.children != null) {
queue.addAll(peek.children);
nLast = peek.children.get(peek.children.size() - 1);
}
//弹出,加入到当前层列表
list.add(queue.poll());
if (peek == last) {
//如果现在弹出的节点是之前标记的最后节点,就要换列表
res.add(list);
list = new LinkedList<>();
last = nLast;
}
}
return res;
}
public static void main(String[] args) {
//这是自己写的树实现类
MyTree<String> tree = new MyTree<>(new TreeNode("a"));
TreeNode<String> root = tree.getRoot();
TreeNode<String> b = new TreeNode<>("b");
tree.insertChild(root, b);
TreeNode<String> c = new TreeNode<>("c");
tree.insertChild(root, c);
TreeNode<String> d = new TreeNode<>("d");
tree.insertChild(root, d);
TreeNode<String> e = new TreeNode<>("e");
tree.insertChild(b, e);
tree.insertChild(b, new TreeNode<>("f"));
tree.insertChild(c, new TreeNode<>("g"));
tree.insertChild(d, new TreeNode<>("h"));
TreeNode<String> i = new TreeNode<>("i");
tree.insertChild(e, i);
tree.insertChild(i, new TreeNode<>("j"));
List<List<TreeNode<String>>> lists = new Main().levelOrder(root);
for (List<TreeNode<String>> list : lists) {
for (TreeNode<String> treeNode : list) {
System.out.print(treeNode.key);
}
System.out.println();
}
}
}