每日一题:二叉树的层序遍历

91 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第N天,点击查看活动详情

题目链接

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

image.png  

示例 1:

输入: root = [3,9,20,null,null,15,7]
输出: [[3],[9,20],[15,7]]

示例 2:

输入: root = [1]
输出: [[1]]

示例 3:

输入: root = []
输出: []

提示:

  • 树中节点数目在范围 [0, 2000] 内
  • -1000 <= Node.val <= 1000

解题思路:层序遍历

这道题因为需要从左至右一层一层的遍历数据,不同于递归遍历,所以需要使用层序遍历来解决

在使用层序遍历时需要借助一个辅助性数据结构,即队列,因为队列的特点就是先进先出,跟我们的层序遍历逻辑一样

实现代码

public List<List<Integer>> levelOrder(TreeNode root) {
        //创建一个队列
        Queue<TreeNode> queue = new LinkedList<>();
        if (root != null) {
            queue.offer(root);
        }
        //创建集合
        ArrayList<List<Integer>> list = new ArrayList<>();
       
        while (!queue.isEmpty()) {
            int size = queue.size();
            //创建内集合
            ArrayList<Integer> temp = new ArrayList<>();
            //这里需要使用固定的size,因为队列的size是不断变化的
            for (int i = 0; i < size; i++) {
                //取出队列中的顶部元素
                TreeNode node = queue.poll();
                //添加到内集合中
                temp.add(node.val);
                //将node的左右子树添加到队列中,进行下次遍历
                if (node.left != null) {
                    queue.offer(node.left);
                }
                if (node.right != null) {
                    queue.offer(node.right);
                }
            }
            //将内集合中的元素添加到集合list中
            list.add(temp);
        }
        return list;
    }

提交记录

image.png