69. 二叉樹的層次遍歷(高頻)

描述

給出一棵二叉樹膊毁,返回其節(jié)點(diǎn)值的層次遍歷(逐層從左往右訪問)

樣例

給一棵二叉樹 {3,9,20,#,#,15,7} :

          3
         / \
        9  20
           /  \
          15   7

返回他的分層遍歷結(jié)果:

        [
          [3],
          [9,20],
          [15,7]
        ]

挑戰(zhàn)

挑戰(zhàn)1:只使用一個(gè)隊(duì)列去實(shí)現(xiàn)它
挑戰(zhàn)2:用DFS算法來(lái)做

說(shuō)明

用隊(duì)列來(lái)做BFS時(shí),無(wú)論寫不寫分層代碼本質(zhì)上都是一層層進(jìn)出隊(duì)列砾隅,只是寫了分層代碼可以在每一層結(jié)束時(shí)將本層全部結(jié)點(diǎn)保存到動(dòng)態(tài)數(shù)組格嗅,可以在輸出上體現(xiàn)每一層都有哪些

代碼

/**
 * Definition of TreeNode:
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left, right;
 *     public TreeNode(int val) {
 *         this.val = val;
 *         this.left = this.right = null;
 *     }
 * }
 */
  1. BST
public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: Level order a list of lists of integer
     */
    public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: Level order a list of lists of integer
     */
    public List<List<Integer>> levelOrder(TreeNode root) {
        List result = new ArrayList();     

        if (root == null) {
            return result;
        }
         
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            ArrayList<Integer> level = new ArrayList<>();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                TreeNode head = queue.poll();
                level.add(head.val);
                if (head.left != null) {
                    queue.offer(head.left);
                }
                if(head.right != null) {
                    queue.offer(head.right);
                }
            }
            // 此處level不需要deep copy,while每次都會(huì)new一個(gè)新的
            result.add(level);
        }

        return result;
    }
}

注意
1.當(dāng)root為空時(shí)式散,不能返回null(會(huì)報(bào)錯(cuò))汉匙,應(yīng)該返回一個(gè)空的result
2.隊(duì)列用linkedlist形式這樣更加方便bst運(yùn)行時(shí)隨時(shí)添加節(jié)點(diǎn)涤姊,節(jié)省開銷

關(guān)鍵點(diǎn)
理解此算法的關(guān)鍵在于理解size代表當(dāng)前層的長(zhǎng)度镣衡,是在每一層節(jié)點(diǎn)全部遍歷完后才進(jìn)行更新的霜定,在size未更新階段for循環(huán)進(jìn)行作用档悠,遍歷層中每一節(jié)點(diǎn),分別將它們的子節(jié)點(diǎn)全部加入隊(duì)列中去望浩,遍歷完一層節(jié)點(diǎn)后辖所,由while循環(huán)判斷下隊(duì)列是否為空(即有沒有將全部節(jié)點(diǎn)添加到level中去), 如果不需要分層,將while后面三行去掉

  1. DFS
public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: Level order a list of lists of integer
     */
    public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
        ArrayList<ArrayList<Integer>> results = new ArrayList<ArrayList<Integer>>();
        
        if (root == null) {
            return results;
        }
        
        int maxLevel = 0;
        while (true) {
            ArrayList<Integer> level = new ArrayList<Integer>();
            dfs(root, level, 0, maxLevel);
            if (level.size() == 0) {
                break;
            }
            
            results.add(level);
            maxLevel++;
        }
        
        return results;
    }
    
    private void dfs(TreeNode root,
                     ArrayList<Integer> level,
                     int curtLevel,
                     int maxLevel) {
        if (root == null || curtLevel > maxLevel) {
            return;
        }
        
        if (curtLevel == maxLevel) {
            level.add(root.val);
            return;
        }
        
        dfs(root.left, level, curtLevel + 1, maxLevel);
        dfs(root.right, level, curtLevel + 1, maxLevel);
    }
}
  1. BFS. two queues
public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: Level order a list of lists of integer
     */
    public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        if (root == null) {
            return result;
        }
        
        ArrayList<TreeNode> Q1 = new ArrayList<TreeNode>();
        ArrayList<TreeNode> Q2 = new ArrayList<TreeNode>();

        Q1.add(root);
        while (Q1.size() != 0) {
            ArrayList<Integer> level = new ArrayList<Integer>();
            Q2.clear();
            for (int i = 0; i < Q1.size(); i++) {
                TreeNode node = Q1.get(i);
                level.add(node.val);
                if (node.left != null) {
                    Q2.add(node.left);
                }
                if (node.right != null) {
                    Q2.add(node.right);
                }
            }
            
            // swap q1 and q2
            ArrayList<TreeNode> temp = Q1;
            Q1 = Q2;
            Q2 = temp;
            
            // add to result
            result.add(level);
        }
        
        return result;
    }
}
  1. BFS, queue with dummy node
public class Solution {
    /**
     * @param root: The root of binary tree.
     * @return: Level order a list of lists of integer
     */
    public ArrayList<ArrayList<Integer>> levelOrder(TreeNode root) {
        ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>();
        if (root == null) {
            return result;
        }
        
        Queue<TreeNode> Q = new LinkedList<TreeNode>();
        Q.offer(root);
        Q.offer(null); // dummy node
        
        ArrayList<Integer> level = new ArrayList<Integer>();
        while (!Q.isEmpty()) {
            TreeNode node = Q.poll();
            if (node == null) {
                if (level.size() == 0) {
                    break;
                }
                result.add(level);
                level = new ArrayList<Integer>();
                Q.offer(null); // add a new dummy node
                continue;
            }
            
            level.add(node.val);
            if (node.left != null) {
                Q.offer(node.left);
            }
            if (node.right != null) {
                Q.offer(node.right);
            }
        }
        
        return result;
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末磨德,一起剝皮案震驚了整個(gè)濱河市缘回,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌典挑,老刑警劉巖酥宴,帶你破解...
    沈念sama閱讀 211,194評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異您觉,居然都是意外死亡拙寡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門琳水,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)肆糕,“玉大人,你說(shuō)我怎么就攤上這事在孝〕峡校” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評(píng)論 0 346
  • 文/不壞的土叔 我叫張陵私沮,是天一觀的道長(zhǎng)始赎。 經(jīng)常有香客問我,道長(zhǎng)仔燕,這世上最難降的妖魔是什么极阅? 我笑而不...
    開封第一講書人閱讀 56,388評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮涨享,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘仆百。我一直安慰自己厕隧,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評(píng)論 5 384
  • 文/花漫 我一把揭開白布俄周。 她就那樣靜靜地躺著吁讨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪峦朗。 梳的紋絲不亂的頭發(fā)上建丧,一...
    開封第一講書人閱讀 49,764評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音波势,去河邊找鬼翎朱。 笑死橄维,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的拴曲。 我是一名探鬼主播争舞,決...
    沈念sama閱讀 38,907評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼澈灼!你這毒婦竟也來(lái)了竞川?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,679評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤叁熔,失蹤者是張志新(化名)和其女友劉穎委乌,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體荣回,經(jīng)...
    沈念sama閱讀 44,122評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遭贸,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驹马。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片革砸。...
    茶點(diǎn)故事閱讀 38,605評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖糯累,靈堂內(nèi)的尸體忽然破棺而出算利,到底是詐尸還是另有隱情,我是刑警寧澤泳姐,帶...
    沈念sama閱讀 34,270評(píng)論 4 329
  • 正文 年R本政府宣布效拭,位于F島的核電站,受9級(jí)特大地震影響胖秒,放射性物質(zhì)發(fā)生泄漏缎患。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評(píng)論 3 312
  • 文/蒙蒙 一阎肝、第九天 我趴在偏房一處隱蔽的房頂上張望挤渔。 院中可真熱鬧,春花似錦风题、人聲如沸判导。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)眼刃。三九已至,卻和暖如春摇肌,著一層夾襖步出監(jiān)牢的瞬間擂红,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工围小, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昵骤,地道東北人树碱。 一個(gè)月前我還...
    沈念sama閱讀 46,297評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像涉茧,于是被迫代替她去往敵國(guó)和親赴恨。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 背景 一年多以前我在知乎上答了有關(guān)LeetCode的問題, 分享了一些自己做題目的經(jīng)驗(yàn)伴栓。 張土汪:刷leetcod...
    土汪閱讀 12,737評(píng)論 0 33
  • 什么是二叉樹伦连? 引用自百度百科:在計(jì)算機(jī)科學(xué)中,二叉樹是每個(gè)節(jié)點(diǎn)最多有兩個(gè)子樹的樹結(jié)構(gòu)钳垮。通常子樹被稱作“左子樹”(...
    AnICoo1閱讀 1,366評(píng)論 0 1
  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu)惑淳,樹與前面介紹的線性表,棧饺窿,隊(duì)列等線性結(jié)構(gòu)不同歧焦,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,442評(píng)論 1 31
  • 一直以來(lái),我都很少使用也避免使用到樹和圖,總覺得它們神秘而又復(fù)雜肚医,但是樹在一些運(yùn)算和查找中也不可避免的要使用到绢馍,那...
    24K男閱讀 6,737評(píng)論 5 14
  • 6月19號(hào)的文章了(本人真實(shí)經(jīng)歷改寫,轉(zhuǎn)載請(qǐng)標(biāo)明出處) 今天搬了宿舍刁赖,從住了四年的地方徹底搬了出來(lái)搁痛,不會(huì)再...
    諸君北面閱讀 691評(píng)論 0 7