数据结构-102. 二叉树的层序遍历

84 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一、题目描述:

给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

 

示例 1:

image.png

输入: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;
    }
}

四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐