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

這道題目還可以,有一點小難度。主要就是,二叉樹如果層級遍歷。
level traversal
那么就是新建一個queue,然后把子孫往里面放就行了。然后就能遍歷。
但是這道題目不是遍歷,而是把一層層的東西存入List。
那么就有個問題,如果有一個queue,無法體現出層與層之間的界限。所以,我用了兩個queue。
一個用來存放這一層的樹結點,然后一個個存入 List中。一個用來存放下一層的子結點,然后當上一層q空時,代表上一層遍歷已經結束了。然后立馬讓上一層的queue指向下一層,下一層的queue則立馬重新申請一塊內存。以此循環。

差不多就這樣吧。

PS: 剛剛聽了同學的思路,感覺更好,只需要使用一個queue。設置一個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;
    }
}

更加簡潔!
**
總結: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;
    }
}

簡單題。做完今天十道題目的任務就完成了。

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);
    }
}

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

就是樹節點還有第三個指針next,把左邊的鏈接到右邊。

也是可以用recursion做的。

iteration就是dfs,因為問題就是要我們解決每一層的關系,所以BFS是最直接的想法。

dfs的話,如果原來的狀態都保存在那里,等到下一次再次回到這一層的時候,就可以繼續用了。
也就是說,即使下去了下,再回來,一切都還未變,該怎樣還可以怎樣。
這兩道題目都是這個特征。

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容