題目:
從上到下按層打印二叉樹,同一層結(jié)點從左至右輸出。每一層輸出一行。
思路:
兩種實現(xiàn)方法:
1.借助兩個隊列,用層數(shù)進行控制兩個隊列的offer.
2.通過每層元素的個數(shù)來控制隊列的offer和新數(shù)組的生成.
代碼:
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;
//奇數(shù)隊列
Queue<TreeNode> queue1 = new LinkedList<>();
//偶數(shù)隊列
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);
}
}
}