Leetcode 102. 二叉树的层序遍历
题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。
示例:
二叉树:[3,9,20,null,null,15,7]
,
3
/ \
9 20
/ \
15 7
返回其层次遍历结果:
[
[3],
[9,20],
[15,7]
]
解题思路一:BFS
其实题目上已经写的很清楚了,二叉树的层序遍历,那就直接使用BFS遍历即可,只不过这个题目需要返回每一层节点的值,那么需要另外拿一个容器保存每一层节点的值。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
//选择LinkedList作为队列使用
LinkedList<TreeNode> list = new LinkedList<>();
//加入首节点
list.offer(root);
while(list.size()!=0){
//每层遍历的值所存放的容器
ArrayList<Integer> newList = new ArrayList<>();
//有层级关系的影响,所以需要先添加完当前的值,才能将下层节点放入队列中,因为
//第二层循环size!=0就不会结束,如果直接添加子节点就会导致size!=0
//全部都会在同一级里面,因此先放到next中,遍历完目前的层后再加入队列
LinkedList<TreeNode> next = new LinkedList<>();
while(list.size()!=0){
//遍历当前队列中的所有同一层的元素
TreeNode node = list.poll();
if(node == null)continue;
//在当前层的容器中加入值
newList.add(node.val);
//将该节点的子节点添加到next中,遍历完后再加入队列
next.offer(node.left);
next.offer(node.right);
}
//将下层节点都放入队列中
list.addAll(next);
if(newList.size()>0)
res.add(newList);
}
return res;
}
}
解题思路二:DFS
也可以用DFS解决该问题,只要在形参中增加一个表示层级的变量level,就可以在存储每一层中所有节点的值中找到相应的容器,并将值加入进去。
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> res = new ArrayList<>();
levelCheck(root,0,res);
return res;
}
public void levelCheck(TreeNode root,Integer level,List<List<Integer>> res){
if(root == null)return;
//如果当前存储每层值的容器容量小于当前level,那就肯定表示还没有初始化
if(res.size() <= level){
res.add(new ArrayList<Integer>());
}
//拿到当前level的容器并加入当前节点的值
res.get(level).add(root.val);
levelCheck(root.left,level+1,res);
levelCheck(root.right,level+1,res);
}
}