剑指Offer60:把二叉树打印成多行(Java)
思路分析
方法一:
沿用上一题“按之字形顺序打印二叉树”的思路,用两个队列实现分层,当一个队列空了意味着这一层遍历完了。
方法二:
用一个队列,二叉树的分层用每一层个数的来划分
题目描述
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
方法一代码:
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > res=new ArrayList<>();
Queue<TreeNode> que1=new LinkedList<>();
Queue<TreeNode> que2=new LinkedList<>();
que1.offer(pRoot);//Stack,Queue都能用isEmpty()判空
while(!que1.isEmpty()||!que2.isEmpty()){
ArrayList<Integer> tmp1=new ArrayList<Integer>();
ArrayList<Integer> tmp2=new ArrayList<Integer>();
while(!que1.isEmpty()){//队列为空,即遍历了一层结点
TreeNode node=que1.poll();
if(node!=null){
tmp1.add(node.val);
que2.offer(node.left);
que2.offer(node.right);
}
}
if(!tmp1.isEmpty()){
res.add(tmp1);
}
while(!que2.isEmpty()){
TreeNode node=que2.poll();
if(node!=null){
tmp2.add(node.val);
que1.offer(node.left);
que1.offer(node.right);
}
}
if(!tmp2.isEmpty()){
res.add(tmp2);
}
}
return res;
}
}
方法二代码:
import java.util.ArrayList;
import java.util.Queue;
import java.util.LinkedList;
public class Solution {
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer> > res =new ArrayList<ArrayList<Integer> >();
if(pRoot==null){
return res;
}
int index=0;
int length=1;
Queue<TreeNode> que=new LinkedList<>();
que.offer(pRoot);
ArrayList<Integer> tmp=new ArrayList<Integer>();
while(!que.isEmpty()){
TreeNode node=que.poll();
tmp.add(node.val);
index++;
if(node.left!=null){
que.offer(node.left);
}
if(node.right!=null){
que.offer(node.right);
}
if(index==length){//意味着遍历完了一层二叉树,像遍历数组一样,index指向从0走到了length-1。
res.add(tmp);
index=0;
length=que.size();
tmp=new ArrayList<Integer>();//每一层新建一个ArrayList<Integer>,保存每一层的数值。
}
}
return res;
}
}