听不少大佬建议过——力扣刷题要从树开始 !
因为可以建立起套路化的思路~ 另外就是锻炼好递归的思想
所以 我们从树开始~
本专题采用 前面提到的 “兔系刷题法”
不求钻研多种解法 只求快速见题型快速刷题!
另外 力扣评论区里看见的——
树的题目写不出来,多背几个模版就行。
前中后序、广度深度遍历、路径和、深度,直径,这些全部背下来。
感觉很有道理!多背些多理解些套路嘛!
本专题整理了tag中包括广度优先搜索的部分题型 都较为简单 适合初学者嗷
刷的这几道广度优先搜索都是使用迭代的方式对树进行一个遍历
都用到了一个队列对节点进行暂时存储
然后再将其按照顺序扔到结果列表中
关于这类题型
我认为可以使用一个模板
下面分享一下 也是我非常耐的一道题——剑指 Offer 32 - I 从上到下打印二叉树(其实就是层序遍历打印二叉树) 一个medium难度的easy题(挺好想的嗷~而且想明白了 刷熟练了套路就大体掌握了)
熟悉了这道题之后 可以解决好多题哦~
废话少说 快来解决这个层序遍历打印二叉树的题!!!
文章目录
下面是两道模板题
剑指 Offer 32 - I. 从上到下打印二叉树 medium
我们的模板 一定要理解透 刷熟练它!
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。
例如:
给定二叉树: [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回:
[3,9,20,15,7]
解题思路
- 特例处理
- 初始化结果列表 和 包含所有根节点的队列
- 进行BFS循环 在队列
queue
为空时跳出 -
- 队首元素出队并记为
node
- 将
node.val
添加到结果列表tmp
尾部 - 向队列
queue
中添加子节点(当前遍历到的node
节点的子节点)
- 队首元素出队并记为
- 将结果列表转换为结果数组来输出
用个循环就ok辽~
Java代码
迭代法
class Solution {
public int[] levelOrder(TreeNode root) {
// 01 特例处理
if (root == null){
return new int[0];
}
// 02 初始化队列 结果列表
Queue<TreeNode> queue = new LinkedList<TreeNode>();//初始化队列 用于按顺序存放遍历到的每层的节点
List<Integer> res = new ArrayList<Integer>();//初始化存结果的列表(但是这不是)
queue.add(root);//先把根节点加到队列中————层序遍历第一个打印的节点
//03 广度优先搜索
while(!queue.isEmpty()){
TreeNode node = queue.poll();//1 节点出队
res.add(node.val);//将节点按顺序加入结果列表中
if (node.left != null) queue.add(node.left);//如果下一层还有节点的话 将其入队
if (node.right != null) queue.add(node.right);//下一层没节点的话 说明已经没有需要加入队列的节点了~
}
// 04 把列表转换成数组
// 可以使用jdk8的新特性 stream流
// return list.stream().mapToInt(Integer::intValue).toArray();
// 但是上面这个速度会慢一些!
int[] ans = new int[res.size()];//这个数组才符合输出条件~
for (int i = 0; i <= res.size() - 1; i ++){
ans[i] = res.get(i);//获取队列中的值 要使用.get(i)
}
return ans;
}
}
102.二叉树的层序遍历
和上一题差不多意思~
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
输入:二叉树:[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
输出:
[
[3],
[9,20],
[15,7]
]
解题思路
在树的遍历中 使用了 BFS(Breadth-First-Search) 也就是广度优先搜索算法解决
【1】特例处理 判断边界条件——根为空
【2】初始化 创建 存放每层节点的队列queue 结果列表res
Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList();
别忘了根节点入队 queue.add(root);
【3】进行BFS广度优先搜索
{1}新建一个临时列表 用于存储当前层的打印结果
List<Integer> temp = new ArrayList<>();
{2}进行循环 把队列中的节点值 node.val
按序添加到临时列表temp
的尾部 & 把加入列表节点的子节点加入到队列中
for(int i = 0; i < levelNum; i++){
//3 把队列中的元素加到临时列表中
TreeNode node = queue.