Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
示例 1:
输入:root = [3,9,20,null,null,15,7] 输出:[[3],[9,20],[15,7]] 示例 2:
输入:root = [1] 输出:[[1]] 示例 3:
输入:root = [] 输出:[]
提示:
树中节点数目在范围 [0, 2000] 内 -1000 <= Node.val <= 1000
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/bi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
二、思路分析:
广度优先遍历是按层层推进的方式,遍历每一层的节点。题目要求的是返回每一层的节点值,所以这题用广度优先来做非常合适。具体思路如下
首先使用 Object 类型创建队列,添加root作为根节点,同时添加0 作为哨兵节点,遍历存储每一层的节点值,循环到每层时获取并移除队列第一个元素,判断元素类型是否是 Integer 类型,也就是之前加入的 0 哨兵节点,如果该元素是 Integer 类型,表示已经到了每一层的末尾,判断此时队列是否为空,如果此时队列不为空,表示还有下一层节点等待遍历,添加新的哨兵节点,将保存的当前层的节点值加入 结果列表,并新建一层列表,如果此时队列为空,表示当前已经遍历完所有节点,将当前层加入结果列表即可,如果该元素不是 Integer 类型,那么当前元素是 TreeNode,添加当前节点值进入当前层列表,并添加当前节点的子节点进入队列
三、AC 代码:
class Solution {
public List<List<Integer>> levelOrder(TreeNode root) {
List<List<Integer>> result = new LinkedList<>();
if(root == null){
return result;
}
Deque<Object> queue = new LinkedList<>();
queue.addLast(root);
queue.addLast(0);
List<Integer> eachLayer = new LinkedList<>();
while(!queue.isEmpty()){
Object pop = queue.removeFirst();
if(pop instanceof Integer){
if(!queue.isEmpty()){
queue.addLast(0);
result.add(eachLayer);
eachLayer = new LinkedList<>();
}else{
result.add(eachLayer);
}
}else{
TreeNode curNode = (TreeNode) pop;
eachLayer.add(curNode.val);
if(curNode.left!=null){
queue.addLast(curNode.left);
}
if(curNode.right!=null){
queue.addLast(curNode.right);
}
}
}
return result;
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐