面试题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 通常借助 队列 的先入先出特性来实现。
遍历树的所有的节点。
- 特判: 如果头节点
root == null时,则直接返回空列表[] - 初始化: 结果列表
res,队列queue - BFS 广度优先搜索: 如果队列
queue为空时结束循环- 出队: 将队首元素出队,记为
node节点; - 赋值: 将
node.val的值 添加到list列表 - 输出: 将
list列表的值赋值给result数组
- 出队: 将队首元素出队,记为
- 打印
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)
4、总结
该题目的对树要了解,并掌握DFS相关知识。对于树,打牢遍历基础。要像有序数组对二分敏感一样,做到树对递归敏感。
关于队列,LinkedList操作
| 方法 | 描述 |
|---|---|
| add | 增加一个元索 如果队列已满,则抛出一个IIIegaISlabEepeplian异常 |
| remove | 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 |
| element | 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常 |
| offer | 添加一个元素并返回true 如果队列已满,则返回false |
| poll | 移除并返问队列头部的元素 如果队列为空,则返回null |
| peek | 返回队列头部的元素 如果队列为空,则返回null |
| put | 添加一个元素 如果队列满,则阻塞 |
| take | 移除并返回队列头部的元素 如果队列为空,则阻塞 |
❤️来自专栏《LeetCode基础算法题》欢迎订阅❤️
厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。
对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!
原题链接:面试题32 - I. 从上到下打印二叉树