題目描述:
從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。
思路:
利用隊列的先進先出,使用隊列進行層次遍歷。
再用兩個變量start和end,start用來記錄本層打印了多少個節點,end用來記錄下一層有多少個節點,當本層節點開始打印的時候,start進行累加,當start==end的時候,說明本層的節點打印完畢,即可將本層的節點加入結果中。
代碼:
package offer01;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
public class TestNo60 {
static class TreeNode{
int val;
TreeNode left = null;
TreeNode right = null;
TreeNode(int val){
this.val = val;
}
}
public static void main(String[] args) {
TreeNode root = new TreeNode(1);
TreeNode node1 = new TreeNode(2);
TreeNode node2 = new TreeNode(3);
TreeNode node3 = new TreeNode(4);
TreeNode node4 = new TreeNode(5);
TreeNode node5 = new TreeNode(6);
TreeNode node6 = new TreeNode(7);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
System.out.println(new TestNo60().Print(root));
}
ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
if(pRoot == null)
return result;
//使用隊列,先進先出
Queue<TreeNode> layer = new LinkedList<TreeNode>();
ArrayList<Integer> layerList = new ArrayList<Integer>();
layer.add(pRoot);
//start記錄本層打印了多少個,end記錄下一層要打印多少
int start = 0,end = 1;
while (!layer.isEmpty()){
TreeNode cur = layer.remove();
layerList.add(cur.val);//添加本行節點值到List中
start++;//記錄本行節點的個數
//每打印一個節點就把該節點的左右節點加入到隊列中,並用end記錄下一行需要打印的節點的個數
if(cur.left != null){
layer.add(cur.left);
}
if(cur.right != null){
layer.add(cur.right);
}
//本層打印完畢
if(start == end){
end = layer.size();
start = 0;//對start進行更新初始化
result.add(layerList);
layerList = new ArrayList<Integer>();//對序列同樣進行更新初始化
}
}
return result;
}
}