剑指offer——把二叉树打印成多行
1、题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
2、我的解法
参照上一个题(按之字形打印二叉树),此处利用两个队列,进行一行一行的打印。
源码如下:
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > arrays=new ArrayList<ArrayList<Integer> >();
if(pRoot==null){
return arrays;
}
Queue<TreeNode> queue1=new LinkedList<TreeNode>();
Queue<TreeNode> queue2=new LinkedList<TreeNode>();
queue1.offer(pRoot);
while(!queue1.isEmpty() || !queue2.isEmpty()){
if(!queue1.isEmpty()){
ArrayList<Integer> array1=new ArrayList<Integer>();
while(!queue1.isEmpty()){
if(queue1.peek().left!=null){
queue2.offer(queue1.peek().left);
}
if(queue1.peek().right!=null){
queue2.offer(queue1.peek().right);
}
array1.add(queue1.poll().val);
}
arrays.add(array1);
}
if(!queue2.isEmpty()){
ArrayList<Integer> array2=new ArrayList<Integer>();
while(!queue2.isEmpty()){
if(queue2.peek().left!=null){
queue1.offer(queue2.peek().left);
}
if(queue2.peek().right!=null){
queue1.offer(queue2.peek().right);
}
array2.add(queue2.poll().val);
}
arrays.add(array2);
}
}
return arrays;
}
}
3、别的解法
利用一个整型记录每一层的节点个数,利用队列进行进队出队。
源码及具体解释如下:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.Queue;
/*
* 队列LinkedList完成层序遍历,用end记录每层结点数目
*/
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > result=new ArrayList<ArrayList<Integer> >();
if(pRoot==null){
return result;
}
ArrayList<Integer> array=new ArrayList<Integer>();
Queue<TreeNode> queue=new LinkedList<TreeNode>();
queue.offer(pRoot);
int start=0,end=1;//end是每一层的节点个数
while(!queue.isEmpty()){
TreeNode current=queue.poll();
array.add(current.val);
start++;
if(current.left!=null){
queue.offer(current.left);
}
if(current.right!=null){
queue.offer(current.right);
}
if(start==end){//start追上end,则证明到每一层的最后一个节点了,需要分行
start=0;
end=queue.size();
result.add(array);
array=new ArrayList<Integer>();//相当于把array清零置空
}
}
return result;
}
}