劍指offerNo60. 把二叉樹打印成多行(Java)

題目描述:

從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。

思路:

利用隊列的先進先出,使用隊列進行層次遍歷。

再用兩個變量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;
    }
}

 

你做羨慕的生活,都是你沒有喫過的苦 ..

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章