剑指 Offer 32 - II. 从上到下打印二叉树 II(102. 二叉树的层序遍历)

题目:

 

思路:

【1】一种是比较好写的,采用辅助空间,一般采用队列,因为先进先出,方便操作:

1.将节点塞入队列
2.循环判断队列是否为空,不为空则要进行处理
3.此时队列里面的数据量为一组数据
4.将这一组数据的节点都拿出来,将值组合成新数组,且判断左节点是否为空,不为则塞入队列,再判断右节点(基于层次的理念,先左后右)

【2】利用递归的方式,但是这种比较绕。

代码展示:

利用递归的方式:

//时间0 ms击败100%
//内存41.4 MB击败74.84%
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        ArrayList<List<Integer>> list = new ArrayList<>();
        search(root,list,0);
        return list;
    }

    void search(TreeNode node,ArrayList<List<Integer>> list,int depth) {
        if (node == null) {
            return;
        }
        List<Integer> newList;
        if (depth >= list.size()) {
            newList = new ArrayList<>();
            list.add(newList);
        }
        newList = list.get(depth);
        newList.add(node.val);
        search(node.left,list,depth + 1);
        search(node.right,list,depth + 1);
    }
}

 

利用队列的方式:

//时间1 ms击败73.7%
//内存41.6 MB击败49.87%
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> res = new ArrayList<List<Integer>>();
        if (root == null) return res;

        Queue<TreeNode> que = new LinkedList<>();
        que.add(root);
        int count;
        TreeNode temp;
        while (!que.isEmpty()){
            List<Integer> resList = new ArrayList<>();
            count = que.size();
            while (count-- > 0){
                temp = que.poll();
                resList.add(temp.val);
                if (temp.left != null) que.add(temp.left);
                if (temp.right != null) que.add(temp.right);
            }
            res.add(resList);
        }

        return res;
    }
}

 

posted @ 2023-02-16 18:19  忧愁的chafry  阅读(15)  评论(0编辑  收藏  举报