思路:使用两个链表,来回跳跃。

  1. 链表的作用其实是模拟队列的功能。
  2. 首先queue1装载根结点root
  3. 将queue1的结点依次从头部出队列
    1)若当前出队列的结点有左子结点,则将其入队列queue2.
    2)若当前出队列的结点有右子结点,则将其入队列queue2.
    3)将当前出队列的结点放入list中,该list是存储同一层的所有结点。
    4)将list加入到res(返回用的ArrayList)中。
  4. 将queue2的结点依次从头部出队列
    1)若当前出队列的结点有左子结点,则将其入队列queue1.
    2)若当前出队列的结点有右子结点,则将其入队列queue1.
    3)将当前出队列的结点放入list中,该list是存储同一层的所有结点。
    4)将list加入到res(返回用的ArrayList)中。
  5. 只要queue1与queue2的size()不同时为0,则循环继续。
import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        // write code here
        ArrayList<ArrayList<Integer>> res=new ArrayList<>();
        if(root==null){
            return res;
        }
        LinkedList<TreeNode> queue1=new LinkedList<>();
        LinkedList<TreeNode> queue2=new LinkedList<>();
        queue1.addLast(root);
        while(queue1.size()!=0 || queue2.size()!=0){
            ArrayList<Integer> list1=new ArrayList<>();
            ArrayList<Integer> list2=new ArrayList<>();
            while(queue1.size()!=0){
                TreeNode tmp=queue1.removeFirst();
                if(tmp.left!=null){
                    queue2.addLast(tmp.left);
                }
                if(tmp.right!=null){
                    queue2.addLast(tmp.right);
                }
                list1.add(tmp.val);
            }
            if(list1.size()!=0){
                res.add(list1);
            }
            while(queue2.size()!=0){
                TreeNode tmp=queue2.removeFirst();
                if(tmp.left!=null){
                    queue1.addLast(tmp.left);
                }
                if(tmp.right!=null){
                    queue1.addLast(tmp.right);
                }
                list2.add(tmp.val);
            }
            if(list2.size()!=0){
                res.add(list2);
            }
        }
        return res;
    }

}