面试题32 - I. 从上到下打印二叉树

220 阅读2分钟

面试题32 - I. 从上到下打印二叉树

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

1、题目📑

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

输入

给定二叉树: [3,9,20,null,null,15,7]

    3

   / \

  9  20

     / \

    15  7

返回

[3,9,20,15,7]

限制

  • 节点总数 <= 1000

2、思路🧠

方法一:辅助队列

  • 要求二叉树 从上至下 打印,此题又称二叉树的 广度优先搜索(BFS)。
  • BFS 通常借助 队列 的先入先出特性来实现。

遍历树的所有的节点。

  1. 特判: 如果头节点 root == null时,则直接返回空列表 []
  2. 初始化: 结果列表 res ,队列 queue
  3. BFS 广度优先搜索: 如果队列 queue 为空时结束循环
    • 出队: 将队首元素出队,记为 node 节点;
    • 赋值: 将 node.val的值 添加到 list 列表
    • 输出: 将 list 列表的值赋值给 result 数组
  4. 打印 reuslt 数组

废话少说~~~~~上代码!

3、代码👨‍💻

第一次commit AC

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] levelOrder(TreeNode root) {
        if(root == null) return new int [0];
        Queue<TreeNode> q = new LinkedList<>();
        List<Integer> list = new ArrayList<>();
        q.add(root);
        while(!q.isEmpty()){
            TreeNode node = q.poll();
            list.add(node.val);
            if(node.left!=null) q.add(node.left);
            if(node.right!=null) q.add(node.right);
        }
        int res[] = new int [list.size()];
        for(int i = 0; i < res.length; i++){
            res[i] = list.get(i);
        }
        return res;
    }
}

时间复杂度:O(N) N 为二叉树的节点数量,BFS 需循环 N 次。

空间复杂度:O(N)

image-20220314180653453

4、总结

该题目的对树要了解,并掌握DFS相关知识。对于树,打牢遍历基础。要像有序数组对二分敏感一样,做到树对递归敏感。

关于队列,LinkedList操作

方法描述
add增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer添加一个元素并返回true 如果队列已满,则返回false
poll移除并返问队列头部的元素 如果队列为空,则返回null
peek返回队列头部的元素 如果队列为空,则返回null
put添加一个元素 如果队列满,则阻塞
take移除并返回队列头部的元素 如果队列为空,则阻塞

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接:面试题32 - I. 从上到下打印二叉树