LeetCode刷题日:102.二叉树的层序遍历

90 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第16天,点击查看活动详情

前言

周三了周三了家人们,明天就是疯狂星期四,今天v我50明天请你吃肯德基。

[102. 二叉树的层序遍历] 难度:中等,其实搞清楚逻辑后是简单题。

题目

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

示例 1:

image.png

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

示例 2:

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

示例 3:

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

审题

在审题时发现就一行字搞定,这题要么特别简单,要么特别难,再看了一下难度,中等?这题是前者,理解思路特别简单。树的遍历有许多种,有深度遍历与广度遍历,先序遍历,中序遍历,后序遍历。而通过审题我们可以发现,他需要的是层序遍历,其实也是广度遍历,所以知道了具体遍历方式我们直接实操即可。

我这里使用的LinkedList区作为存储,因为我不需要频繁变更数组,只有添加操作而已。而频繁添加和使用的剩余节点存放,我选择了队列,队列拥有先进先出的效果使用起来很方便,然后通过leftSize去分割剩余队列中的值,从而达到剩余队列中存放的永远是下一层的数据。这里你也可以不使用我这个leftSize去存放可以采用其他的存储方式,其逻辑就是为了实现有一个地方可以存放下一层需要遍历的节点即可。

我的解题代码

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new LinkedList<>();
        Queue<TreeNode> queue = new LinkedList<>();
        queue.add(root);
        int leftSize;
        //每次把剩余队列的长度赋值给 leftSize,leftSize是决定内层循环次数
        while ((leftSize = queue.size()) > 0){
           List<Integer>  partResult = new LinkedList<>();
            while (leftSize-- != 0){
                TreeNode curNode = queue.poll();
                if (curNode == null) {
                    continue;
                }
                partResult.add(curNode.val);
                queue.add(curNode.left);
                queue.add(curNode.right);
            }
            if (partResult.size() != 0) {
                result.add(partResult);
            }
        }
        return result;
    }
}

耗时

image.png