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:

《Leetcode - Binary Tree Level Order Traversal》 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

    原文作者:Richardo92
    原文地址: https://www.jianshu.com/p/804d4cc92626#comments
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞