题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路分析
和剑指offer(22)思路基本一致,不过加入了两个变量,start记录已打印节点数,end记录当前层总节点数,以此来实现分层
代码
queue写法
public class 把二叉树打印成多行 {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
if (pRoot == null){
return list;
}
Queue<TreeNode> queue = new LinkedList<TreeNode>();
ArrayList<Integer> list1 = new ArrayList<Integer>();
queue.offer(pRoot);
int start = 0; //当前层数已添加节点数
int end = 1; //当前层数目标添加节点数
while (!queue.isEmpty()){
TreeNode temp = queue.poll();
list1.add(temp.val);
start++;
if (temp.left != null) {
queue.offer(temp.left);
}
if (temp.right != null) {
queue.offer(temp.right);
}
if (start == end) {
end = queue.size(); //本层的所有节点已出队,队列中所剩刚好是下一层的全部节点
start = 0;
list.add(list1);
list1 = new ArrayList<Integer>();
}
}
return list;
}
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
}
结果
arraylist写法
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
if (pRoot == null) {
return list;
}
ArrayList<Integer> list1 = new ArrayList<Integer>();
ArrayList<TreeNode> queue = new ArrayList<TreeNode>();
queue.add(pRoot);
int end = 1;
int start = 0;
while ( !queue.isEmpty() ) {
TreeNode tempNode = queue.remove(0);
start++;
list1.add(tempNode.val);
if (tempNode.left != null) {
queue.add(tempNode.left);
}
if (tempNode.right != null) {
queue.add(tempNode.right);
}
if (start == end) {
start = 0;
end = queue.size();
list.add(list1);
list1 = new ArrayList<Integer>();
}
}
return list;
}
结果