Leetcode - Binary Tree Level Order Traversal

![Upload Paste_Image.png failed. Please try again.]

My code:

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        if (root == null)
            return result;

        Queue<TreeNode> q = new LinkedList<TreeNode>();
        Queue<TreeNode> qSon = new LinkedList<TreeNode>();
        q.add(root);
        ArrayList<Integer> sample = new ArrayList<Integer>();
        while(!q.isEmpty()) {
            TreeNode temp = q.poll();
            sample.add(temp.val);
            if (q.isEmpty()) {  
                if (temp.left != null)
                    qSon.add(temp.left);
                if (temp.right != null)
                    qSon.add(temp.right);
                result.add(sample);
                sample = new ArrayList<Integer>();
                q = qSon;
                qSon = new LinkedList<TreeNode>();
            }
            else {
                if (temp.left != null)
                    qSon.add(temp.left);
                if (temp.right != null)
                    qSon.add(temp.right);
            }
        }
        return result;
    }
}

My test result:

Paste_Image.png

這道題目還可以镀赌,有一點(diǎn)小難度。主要就是,二叉樹如果層級遍歷痴怨。
level traversal
那么就是新建一個queue,然后把子孫往里面放就行了搅窿。然后就能遍歷节值。
但是這道題目不是遍歷,而是把一層層的東西存入List即碗。
那么就有個問題焰情,如果有一個queue,無法體現(xiàn)出層與層之間的界限剥懒。所以内舟,我用了兩個queue。
一個用來存放這一層的樹結(jié)點(diǎn)初橘,然后一個個存入 List中验游。一個用來存放下一層的子結(jié)點(diǎn),然后當(dāng)上一層q空時保檐,代表上一層遍歷已經(jīng)結(jié)束了耕蝉。然后立馬讓上一層的queue指向下一層,下一層的queue則立馬重新申請一塊內(nèi)存夜只。以此循環(huán)垒在。

差不多就這樣吧。

PS: 剛剛聽了同學(xué)的思路扔亥,感覺更好场躯,只需要使用一個queue。設(shè)置一個level size砸王。

import java.util.*;

public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> output = new ArrayList<List<Integer>>();
        if (root == null)
            return output;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.add(root);
        
        while (!queue.isEmpty()) {
            int levelSize = queue.size();
            List<Integer> list = new ArrayList<Integer>();
            for(int i = 0; i < levelSize; i++) { 
                TreeNode n = queue.poll();
                list.add(n.val);
                if(n.left != null)
                    queue.add(n.left); 
                if(n.right != null)
                    queue.add(n.right);
            }
            output.add(list);
        }
        
        return output;
    }
}

更加簡潔推盛!
**
總結(jié):Queue, level traversal
**

Anyway, Good luck, Richardo!

My code:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        ArrayList<List<Integer>> ret = new ArrayList<List<Integer>>();
        if (root == null)
            return ret;
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.offer(root);
        while (!q.isEmpty()) {
            int levelSize = q.size();
            ArrayList<Integer> group = new ArrayList<Integer>();
            for (int i = 0; i < levelSize; i++) {
                TreeNode temp = q.poll();
                group.add(temp.val);
                if (temp.left != null)
                    q.offer(temp.left);
                if (temp.right != null)
                    q.offer(temp.right);
            }
            ret.add(group);
        }
        return ret;
    }
}

簡單題目谦铃。

Anyway, Good luck, Richardo!

My code:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        if (root == null) {
            return ret;
        }
        
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        q.offer(root);
        while (!q.isEmpty()) {
            int size = q.size();
            List<Integer> list = new ArrayList<Integer>();
            for (int i = 0; i < size; i++) {
                TreeNode node = q.poll();
                list.add(node.val);
                if (node.left != null) {
                    q.offer(node.left);
                }
                if (node.right != null) {
                    q.offer(node.right);
                }
            }
            ret.add(list);
        }
        
        return ret;
    }
}

簡單題耘成。做完今天十道題目的任務(wù)就完成了。

Anyway, Good luck, Richardo! -- 08/29/2016

沒想到還有一種 recursion的方法:

My code:

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        if (root == null) {
            return ret;
        }
        
        helper(root, 0, ret);
        return ret;
    }
    
    private void helper(TreeNode root, int level, List<List<Integer>> ret) {
        if (root == null) {
            return;
        }
        
        if (level > ret.size() - 1) {
            ret.add(new ArrayList<Integer>());
        }
        ret.get(level).add(root.val);
        helper(root.left, level + 1, ret);
        helper(root.right, level + 1, ret);
    }
}

也很簡潔。
這讓我想起了一道題目瘪菌。

就是樹節(jié)點(diǎn)還有第三個指針next撒会,把左邊的鏈接到右邊。

也是可以用recursion做的师妙。

iteration就是dfs诵肛,因?yàn)閱栴}就是要我們解決每一層的關(guān)系,所以BFS是最直接的想法默穴。

dfs的話怔檩,如果原來的狀態(tài)都保存在那里,等到下一次再次回到這一層的時候蓄诽,就可以繼續(xù)用了薛训。
也就是說,即使下去了下仑氛,再回來乙埃,一切都還未變,該怎樣還可以怎樣锯岖。
這兩道題目都是這個特征介袜。

Anyway, Good luck,Richardo! -- 09/06/2016

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市出吹,隨后出現(xiàn)的幾起案子遇伞,更是在濱河造成了極大的恐慌,老刑警劉巖趋箩,帶你破解...
    沈念sama閱讀 212,884評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件赃额,死亡現(xiàn)場離奇詭異加派,居然都是意外死亡叫确,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評論 3 385
  • 文/潘曉璐 我一進(jìn)店門芍锦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來竹勉,“玉大人,你說我怎么就攤上這事娄琉〈闻遥” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評論 0 348
  • 文/不壞的土叔 我叫張陵遣蚀,是天一觀的道長苛秕。 經(jīng)常有香客問我甜滨,道長,這世上最難降的妖魔是什么杏慰? 我笑而不...
    開封第一講書人閱讀 56,799評論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上缘滥,老公的妹妹穿的比我還像新娘轰胁。我一直安慰自己,他們只是感情好朝扼,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評論 6 386
  • 文/花漫 我一把揭開白布赃阀。 她就那樣靜靜地躺著,像睡著了一般擎颖。 火紅的嫁衣襯著肌膚如雪榛斯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評論 1 291
  • 那天搂捧,我揣著相機(jī)與錄音肖抱,去河邊找鬼。 笑死异旧,一個胖子當(dāng)著我的面吹牛意述,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吮蛹,決...
    沈念sama閱讀 39,159評論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼荤崇,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了潮针?” 一聲冷哼從身側(cè)響起术荤,我...
    開封第一講書人閱讀 37,917評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎每篷,沒想到半個月后瓣戚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡焦读,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評論 2 327
  • 正文 我和宋清朗相戀三年子库,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片矗晃。...
    茶點(diǎn)故事閱讀 38,814評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡仑嗅,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出张症,到底是詐尸還是另有隱情仓技,我是刑警寧澤,帶...
    沈念sama閱讀 34,509評論 4 334
  • 正文 年R本政府宣布俗他,位于F島的核電站脖捻,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兆衅。R本人自食惡果不足惜地沮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評論 3 317
  • 文/蒙蒙 一颜价、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧诉濒,春花似錦周伦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至片排,卻和暖如春寨腔,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背率寡。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評論 1 267
  • 我被黑心中介騙來泰國打工迫卢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人冶共。 一個月前我還...
    沈念sama閱讀 46,641評論 2 362
  • 正文 我出身青樓乾蛤,卻偏偏與公主長得像,于是被迫代替她去往敵國和親捅僵。 傳聞我的和親對象是個殘疾皇子家卖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評論 2 351

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