输入输出示例
1 5 6 8 4 2 3 4 8
[[1], [5, 6], [8, 4, 2, 3], [4, 8]]
package interview;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
class Main9 {
public static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) {
val = x;
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String str = "";
while ((str = br.readLine()) != null && !"".equals(str)) {
String[] arr = str.split(" ");
// 第一个节点为根节点
TreeNode root = new TreeNode(Integer.parseInt(arr[0]));
Queue<TreeNode> queue = new LinkedList<>();
TreeNode cur = root; // 当前节点
int num = 1;// 已经构造了的节点数
int count = 0;// 二叉树,每构造一个左右子树,需要切换下一个父节点
while (num < arr.length) {
// ==2表示左右子树都构造了,切换节点,按层序来构造
if (count == 2) {
cur = queue.poll();
count = 0;
}
if (cur.left == null && num < arr.length) {
// 构造左子树,并放入队列
cur.left = new TreeNode(Integer.parseInt(arr[num++]));
queue.offer(cur.left);
count++;
}
if (cur.right == null && num < arr.length) {
// 构造右子树,并放入队列
cur.right = new TreeNode(Integer.parseInt(arr[num++]));
queue.offer(cur.right);
count++;
}
}
System.out.println(levelOrder(root));;
}
}
public static List<List<Integer>> levelOrder(TreeNode root) {
// 保存最终输出的结构
List<List<Integer>> result = new ArrayList<List<Integer>>();
Queue<TreeNode> d = new LinkedList<TreeNode>();
d.offer(root);
int num = 1;// num表示本层有几个节点,起始的根节点只有一个
while(d.size() != 0) {
int count = num;// 本层有几个节点,就循环几次
num = 0;// 循环中来获取下一层的节点数
ArrayList<Integer> each = new ArrayList<>();// 每层的节点值,层序
// 把各个节点的左右子树压入队列,等count循环完毕时,队列中只存在下一层的节点
for (int i = 0; i < count; i++) {
TreeNode poll = d.poll();
if (poll.left != null) {
d.offer(poll.left);
num++;
}
if (poll.right != null) {
d.offer(poll.right);
num++;
}
each.add(poll.val);
}
result.add(each);
}
return result;
}
}
认清自己的一天