import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/**
* 把二叉树打印多行
*
* 从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
*
* 示例:
* 输入:{8,6,10,5,7,9,11}
* 输出:[[8],[6,10],[5,7,9,11]]
*
*/
public class JZ060PrintMultipleLinesOfBinaryTree {
/**
* 1、初始化一个队列,初始元素为root
* 2、遍历元素,每次首先获取当前队列的节点个数,即当前队列的size
* 3、弹出size次元素,则本次遍历到的均为本层的元素
* 4、每次弹出元素的同时,把元素的左右孩子加入队列,以便下次遍历
* @param pRoot
* @return
*/
ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
if (pRoot == null) {
return lists;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(pRoot);
// 当前处理的元素
TreeNode curNode;
while (!queue.isEmpty()) {
int size = queue.size();
// 当前层的节点值,按照应该打印的顺序添加到列表中
ArrayList<Integer> curList = new ArrayList<>();
for (int i = 0; i < size; i++) {
curNode = queue.poll();
curList.add(curNode.val);
if (curNode.left != null) {
queue.offer(curNode.left);
}
if (curNode.right != null) {
queue.offer(curNode.right);
}
}
lists.add(curList);
}
return lists;
}
/**
* 1、每行数据加入队列,记录当前行的节点数,和下一行的节点数
* 2、当前行打印完毕后,更新当前行节点数为下一行节点数量,换行,元素加入列表。
* @param pRoot
* @return
*/
public static ArrayList<ArrayList<Integer>> Print2 (TreeNode pRoot) {
ArrayList<ArrayList<Integer>> lists = new ArrayList<ArrayList<Integer>>();
if (pRoot == null) {
return lists;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(pRoot);
TreeNode curNode;
int curCount = queue.size();
int nextCount = 0;
ArrayList<Integer> cache = new ArrayList<>();
while (!queue.isEmpty()) {
curNode = queue.poll();
curCount--;
cache.add(curNode.val);
if (curNode.left != null) {
queue.offer(curNode.left);
nextCount++;
}
if (curNode.right != null) {
queue.offer(curNode.right);
nextCount++;
}
if (curCount == 0) {
curCount = nextCount;
nextCount = 0;
// lists.add(cache) 这个是错误的
lists.add(new ArrayList<>(cache));
cache.clear();
}
}
return lists;
}
public static void main(String[] args) {
// {8,6,10,5,7,9,11}
TreeNode root = new TreeNode(8);
TreeNode rootLeft = new TreeNode(6);
root.left = rootLeft;
TreeNode rootRight = new TreeNode(10);
root.right = rootRight;
ArrayList<ArrayList<Integer>> lists = Print2(root);
for (int i = 0; i < lists.size(); i++) {
ArrayList<Integer> list = lists.get(i);
for (int j = 0; j < list.size(); j++) {
System.out.print(list.get(j));
}
System.out.print(" ");
}
}
}