题目:
从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。
思路:
两种实现方法:
1.借助两个队列,用层数进行控制两个队列的offer.
2.通过每层元素的个数来控制队列的offer和新数组的生成.
代码:
public class PrintThree
{
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();
if(pRoot == null)
return arrayLists;
Queue<TreeNode> queue = new LinkedList<>();
ArrayList<Integer> arrayList = new ArrayList<>();
int start = 0;
int end = 1;
queue.offer(pRoot);
while(!queue.isEmpty()){
TreeNode node = queue.poll();
start++;
if(node.left != null)
queue.add(node.left);
if(node.right != null)
queue.add(node.right);
if(start == end){
start = 0;
end = queue.size();
arrayLists.add(arrayList);
arrayList = new ArrayList<>();
}
}
return arrayLists;
}
}
public class PrintTwo
{
public ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> arrayLists = new ArrayList<>();
if(pRoot == null){
return arrayLists;
}
int number = 1;
//奇数队列
Queue<TreeNode> queue1 = new LinkedList<>();
//偶数队列
Queue<TreeNode> queue2 = new LinkedList<>();
queue1.add(pRoot);
while(!queue1.isEmpty()||!queue2.isEmpty()){
if(number % 2 != 0){
ArrayList<Integer> arrayList = new ArrayList<>();
addNode(queue1,queue2,arrayList);
if(!arrayList.isEmpty()){
number++;
arrayLists.add(arrayList);
}
}else{
ArrayList<Integer> arrayList = new ArrayList<>();
addNode(queue2,queue1,arrayList);
if(!arrayList.isEmpty()){
number++;
arrayLists.add(arrayList);
}
}
}
return arrayLists;
}
private void addNode(Queue<TreeNode> queue1,Queue<TreeNode> queue2,ArrayList<Integer> arrayList){
while(!queue1.isEmpty()){
TreeNode node = queue1.poll();
arrayList.add(node.val);
if(node.left != null)
queue2.add(node.left);
if(node.right != null)
queue2.add(node.right);
}
}
}