按層次打印二叉樹

有一棵二叉樹,請設(shè)計一個算法,按照層次打印這棵二叉樹。
給定二叉樹的根結(jié)點root,請返回打印結(jié)果,結(jié)果按照每一層一個數(shù)組進行儲存,所有數(shù)組的順序按照層數(shù)從上往下,且每一層的數(shù)組內(nèi)元素按照從左往右排列。保證結(jié)點數(shù)小于等于500。

思路

按層次遍歷二叉樹,只要利用隊列就可以實現(xiàn)了.但是要按層次打印的話必須要記錄下每層的最后一個節(jié)點.這里我們采用兩個變量lastnLast分別記錄當(dāng)前行的最后一個節(jié)點和目前已知的最后一個節(jié)點.當(dāng)前遍歷的節(jié)點為cur.

last初始值為root.由nLast負(fù)責(zé)更新.
nLast一直指向已經(jīng)遍歷的最后一個節(jié)點.隊列中每加入一個節(jié)點,nLast就指向該節(jié)點. 并且當(dāng)cur=last,更新last=nLast

上代碼:

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;
    public TreeNode(int val) {
        this.val = val;
    }
}*/
public class TreePrinter {
    public int[][] printTree(TreeNode root) {
        if(root==null) return null;
        ArrayList<ArrayList<Integer>> nodes=new ArrayList<>();
        ArrayList<Integer> curLine=new ArrayList<>();
        Queue<TreeNode> queue=new LinkedList<>();
        queue.offer(root);
        TreeNode cur=null,last=root,nLast=null;
        while(!queue.isEmpty()){
            cur=queue.poll();
            curLine.add(cur.val);
            if(cur.left!=null){
                queue.offer(cur.left);
                nLast=cur.left;
            }
            if(cur.right!=null){
                queue.offer(cur.right);
                nLast=cur.right;
            }
            if(cur==last){        //節(jié)點等于last,說明到達了當(dāng)前行的最后一個節(jié)點,
                nodes.add(curLine);
                last=nLast;
                curLine=new  ArrayList<Integer>();
            }
        }
        int[][]result=new int[nodes.size()][];
        for(int i=0;i<nodes.size();i++){
            curLine=nodes.get(i);
            result[i]=new int[curLine.size()];
            int j=0;
            for(Integer num:curLine){
               result[i][j++]=num;
            }
        } 
        return result;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表,棧,隊列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,754評論 1 31
  • 課程介紹 先修課:概率統(tǒng)計,程序設(shè)計實習(xí),集合論與圖論 后續(xù)課:算法分析與設(shè)計,編譯原理,操作系統(tǒng),數(shù)據(jù)庫概論,人...
    ShellyWhen閱讀 2,462評論 0 3
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結(jié)點至多有m個孩子。 除根結(jié)點和葉子結(jié)點外,其它每個結(jié)點至少有m...
    文檔隨手記閱讀 13,661評論 0 25
  • 什么是”樹“ 樹(tree)是包含n(n>0)個結(jié)點的有窮集,其中:(1)每個元素稱為結(jié)點(node)(2)有一個...
    Neo_joke閱讀 1,302評論 1 5
  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 5,986評論 0 19

友情鏈接更多精彩內(nèi)容