leetcode刷题:二叉树04(二叉树的层序遍历)

63 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

102.二叉树的层序遍历

力扣题目链接

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

102.二叉树的层序遍历

乍一看挺复杂,仔细做一下,一招秒。 在这里插入图片描述

package com.programmercarl.tree;

import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Deque;
import java.util.List;

/**
 * @ClassName LevelOrder
 * @Descriotion TODO
 * @Author nitaotao
 * @Date 2022/7/3 11:55
 * @Version 1.0
 * https://leetcode.cn/problems/binary-tree-level-order-traversal/
 * 102. 二叉树的层序遍历
 **/
public class LevelOrder {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> result = new ArrayList<List<Integer>>();
        Deque<TreeNode> deque = new ArrayDeque();
        if (root == null) {
            return result;
        }
        //入队
        deque.offer(root);
        while (!deque.isEmpty()) {
            int size=deque.size();
            List<Integer> floor = new ArrayList();
            while (size > 0) {
                //每次遍历一层
                TreeNode node = deque.poll();
                floor.add(node.val);
                if (node.left != null) {
                    deque.offer(node.left);
                }
                if (node.right != null) {
                    deque.offer(node.right);
                }
                size--;
            }
            result.add(floor);
        }
        return result;
    }
}

层序遍历,大 list 包小 list 。 每个小 list 为一层。 一层一层来,记录当前队列的长度,就是上一层有多少元素,这次就弹出多少次,把新元素继续加在队列尾部即可。

看了一下题解,我的属于广度优先遍历,还有深度优先遍历。
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    public List<List<Integer>> resList = new ArrayList<List<Integer>>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        checkFun01(root, 0);
        return resList;
    }

    public void checkFun01(TreeNode node, Integer deep) {
        if (node == null) {
            return;
        }
        deep++;
        if (resList.size() < deep) {
            //当层级增加时,list的Item也增加,利用List的索引值进行层级结点
            List<Integer> item = new ArrayList<>();
            resList.add(item);
        }
        resList.get(deep - 1).add(node.val);
        checkFun01(node.left, deep);
        checkFun01(node.right, deep);
    }
}

在这里插入图片描述

有一说一我看到不太懂,有点像先准备一个 List ,然后深度优先遍历,把结果按层序遍历的索引放上去。