进步感受:

递归的方法,没有什么好讲的,就是前序遍历的变种,只是传了depth的参数。

终于彻底弄懂,队列的层序遍历了!Good job!

下面解题思路分享弄懂过程。

解题思路:队列版本,关键是下面这句,创造了一种特殊的队列循环!

while(!q.isEmpty()) { n=q.size(); for(int i=0;i<n;i++) { q.poll(); q.add()} }

1、 定义队列循用于存入每一层的节点,初始化先存root节点;

2、 通过while嵌套for循环遍历,逐个取出第n层节点值,并新加下一层节点,过程如下:

import java.util.*;

public class Solution {
    /**
     * 层次遍历本质上是一种变种的前序遍历
     * 只是增加了一个depth作为记录,你在哪一层,
     * 在递归的时候,就可以层层递进传递下去
     * @param root TreeNode类 
     * @return int整型ArrayList<ArrayList<>>
     */
    public ArrayList<ArrayList<Integer>> levelOrder2 (TreeNode root) {
        ArrayList<ArrayList<Integer>> res = new ArrayList<ArrayList<Integer>>();
        preOrderTreeNode(root, res, 1);
        return res;
    }

    void preOrderTreeNode(TreeNode root, ArrayList<ArrayList<Integer>> res, int depth) {
        if(root!=null) {
            if(res.size()< depth) {
                res.add(new ArrayList<Integer>());
            }
            res.get(depth-1).add(root.val);
        } else {
            return;
        }
        preOrderTreeNode(root.left, res, depth+1);
        preOrderTreeNode(root.right, res, depth+1);
    }

    public ArrayList<ArrayList<Integer>> levelOrder (TreeNode root) {
        ArrayList<ArrayList<Integer>>  res = new ArrayList<ArrayList<Integer>> ();
        if(root == null) {
            return res;
        }
        // 定义队列循存入每一层的节点
        ArrayDeque<TreeNode> q = new ArrayDeque<>();
        // 根节点入队进入第一层遍历
        q.add(root);
        // 判断遍历的第N层是否有节点?
        while(!q.isEmpty()) {
            ArrayList<Integer> row = new ArrayList<>();
            int n = q.size(); //取出这一层的节点数,不能在for循环取,因为会新加下一层节点
            for(int i=0;i<n; i++) { //逐个取出此层节点值,并新加下一层节点
                TreeNode node = q.poll();
                row.add(node.val);
                if(node.left!=null) {
                    q.add(node.left);
                }
                if(node.right!=null) {
                    q.add(node.right);
                }
            }
            res.add(row); 
        }
        return res;
    }
}