前言
最近也是放假了,准备好好进阶一下算法,但是又觉得每天单刷起不到太大的效果,所以就准备刷系列了,今天是刷系列题的第一天,二叉树系列之层序遍历。
题目要求:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]
问题分析:
这是一道很基础的二叉树的层序遍历问题,简单说就是将二叉树的每层的节点放到一个集合中,有多少层就有多少个子集合。下面哦我们介绍两种方法来进行解析。
一种是通过递归来实现遍历,另一种是借助队列来实现。
解题代码:
借助递归
class Solution {
// 定义返回结果集
List<List<Integer>> resList = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
checkFun(root,0);
return resList;
}
//递归函数
public void checkFun(TreeNode node,Integer deep){
//如果当前节点为空,直接返回
if(node == null){
return;
}
deep++;
//如果结果集中的集合个数小于层数,则继续添加
while(resList.size()<deep){
List<Integer> item = new ArrayList<>();
resList.add(item);
}
//往上一个集合中添加当前节点
resList.get(deep - 1).add(node.val);
//递归
checkFun(node.left,deep);
checkFun(node.right,deep);
}
}
借助队列
class Solution {
// 定义返回结果集
List<List<Integer>> resList = new ArrayList<>();
public List<List<Integer>> levelOrder(TreeNode root) {
checkFun(root);
return resList;
}
//借助队列
public void checkFun(TreeNode node){
if(node == null){
return;
}
Queue<TreeNode> que = new LinkedList<>();
//将当前节点插入队列
que.offer(node);
while(!que.isEmpty()){
//如果队列不为空
List<Integer> list = new ArrayList<>();
int len = que.size();
while(len > 0){
//如果队列不为空
//弹出第一个元素,将该元素添加到集合中
TreeNode tempNode = que.poll();
list.add(tempNode.val);
//加入该元素的左右子节点
if(tempNode.left != null){
que.offer(tempNode.left);
}
if(tempNode.right != null){
que.offer(tempNode.right);
}
//队列长度减一
len--;
}
resList.add(list);
}
}
}