一、题目描述
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。

二、解题思路
先来补充知识,数据结构中的广度优先搜索,这里给出详细的搜索过程,方便大家学习。
先来给一个节点图,

广度优先搜索详细步骤:
第一步:我们从顶点A开始,A的未访问节点有BED三个顶点,首先访问A的第一个未访问顶点,然后访问A的第二个未访问顶点,再访问A的第三个未访问顶点,这是的搜索顺序是A——B——E——D
第二步:由于B是在E和D之前被访问的,接下来首先访问B的未访问邻节点,是C;这是再访问E的邻节点,E的未访问邻节点是G,访问G;最后再来访问D的邻接未访问节点,但由于D的邻接节点G已经访问过了,不再访问,此时搜索顺序更新为了A——B——E——D——C——G
第三步:这是按照顺序,我们应该访问节点C的邻接点了,因为C在D之后,G之前,而D的邻节点在第二步已经访问过啦,此时C的邻节点只有F访问F。然后访问G的邻接节点,访问H;此时在更新搜索顺序:
A——B——E——D——C——G——F——H
第四步:由于F在H之前被访问故接下来访问F的未访问邻节点,但是F没有未访问的邻节点,所以直接考虑在F之后被访问的节点H,即接下来应访问H的未访问的邻节点,所以访问I。
最后得到访问序列(搜索顺序):A——B——E——D——C——G——F——H——I
有没有层层遍历的感觉呢?
对应到二叉树的层次遍历中
给定一颗二叉树,输出它的层次遍历来看看。

层次遍历结果是:1-2-3-4-5-6-7-8-9
是不是发现可以使用广度优先搜索来解决二叉树的层次遍历。
三、代码演示
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
//这个集合用来存放最终的结果集
List<List<Integer>> reList = new ArrayList<>();
if(root == null){
return reList;
}
//声明的这个队列是用来为每一个节点做判断用的,判断该节点是否存在左右子树,并存储他们
LinkedList<TreeNode> queue = new LinkedList<>();
//将根节点加入到队列中
queue.add(root);
//此时遍历队列,直到队列为空
while(!queue.isEmpty()){
//用于存放当前这一层的所有节点值的集合
List<Integer> curLevelNode = new ArrayList<>();
//获取当前层的节点数量,节点数量为当前队列的长度
int curLevelNum = queue.size();
//将当前层的节点依次出队
for(int i=0; i<curLevelNum; i++){
//队列中元素出队,声明一个变量存储每次出队的节点
TreeNode curNode = queue.removeFirst();
//将这个每次出队的值放到上面声明的curLevelNode集合中
curLevelNode.add(curNode.val);
//判断每次出队列的这个值的左右子树,如果存在将其左右子树排在队列后面,进入下一轮循环
if(curNode.left != null){
queue.add(curNode.left);
}
if(curNode.right != null){
queue.add(curNode.right);
}
}
//一次for循环遍历一层的节点,遍历完之后将其加入到最终结果集合中
reList.add(curLevelNode);
}
return reList;
}
}
本文详细介绍了一种解决二叉树层次遍历问题的方法,并通过广度优先搜索的原理进行了解释。文中提供了完整的实现代码,帮助读者理解如何逐层访问二叉树的所有节点。
1336

被折叠的 条评论
为什么被折叠?



