力扣树专题-6 广度优先搜索 刷熟一个模板(层序遍历打印二叉树)秒杀一堆问题leetcode102 111 116 617 java刷题笔记

本文介绍了力扣刷题中树专题的广度优先搜索(BFS)应用,通过剑指 Offer 32 - I. 从上到下打印二叉树等题目,讲解层序遍历的解题思路和Java实现。通过模板化的方法,如队列存储节点,可以解决102.二叉树的层序遍历、111.二叉树的最小深度、116.填充每个节点的下一个右侧节点指针等题目,帮助初学者掌握BFS的基本套路。
摘要由CSDN通过智能技术生成

听不少大佬建议过——力扣刷题要从树开始 !
因为可以建立起套路化的思路~ 另外就是锻炼好递归的思想
所以 我们从树开始~
本专题采用 前面提到的 “兔系刷题法
不求钻研多种解法 只求快速见题型快速刷题!

另外 力扣评论区里看见的——

树的题目写不出来,多背几个模版就行。

前中后序、广度深度遍历、路径和、深度,直径,这些全部背下来。

感觉很有道理!多背些多理解些套路嘛!

本专题整理了tag中包括广度优先搜索的部分题型 都较为简单 适合初学者嗷

刷的这几道广度优先搜索都是使用迭代的方式对树进行一个遍历
都用到了一个队列对节点进行暂时存储
然后再将其按照顺序扔到结果列表中

关于这类题型
我认为可以使用一个模板
下面分享一下 也是我非常耐的一道题——剑指 Offer 32 - I 从上到下打印二叉树(其实就是层序遍历打印二叉树) 一个medium难度的easy题(挺好想的嗷~而且想明白了 刷熟练了套路就大体掌握了)
熟悉了这道题之后 可以解决好多题哦~
废话少说 快来解决这个层序遍历打印二叉树的题!!!
在这里插入图片描述

下面是两道模板题

在这里插入图片描述

剑指 Offer 32 - I. 从上到下打印二叉树 medium

我们的模板 一定要理解透 刷熟练它!

剑指 Offer 32 - I. 从上到下打印二叉树

从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。

例如:
给定二叉树: [3,9,20,null,null,15,7],

     3
	/ \
   9  20
   	 /  \
    15   7

返回:

[3,9,20,15,7]

解题思路

  • 特例处理
  • 初始化结果列表 和 包含所有根节点的队列
  • 进行BFS循环 在队列 queue 为空时跳出
    • 队首元素出队并记为 node
    • node.val添加到结果列表 tmp尾部
    • 向队列 queue中添加子节点(当前遍历到的 node节点的子节点)
  • 将结果列表转换为结果数组来输出

用个循环就ok辽~

Java代码

迭代法

class Solution {
   
    public int[] levelOrder(TreeNode root) {
   
        // 01 特例处理
        if (root == null){
   
            return new int[0];
        }
        // 02 初始化队列 结果列表
        Queue<TreeNode> queue = new LinkedList<TreeNode>();//初始化队列 用于按顺序存放遍历到的每层的节点
        List<Integer> res = new ArrayList<Integer>();//初始化存结果的列表(但是这不是)
        queue.add(root);//先把根节点加到队列中————层序遍历第一个打印的节点

        //03 广度优先搜索
        while(!queue.isEmpty()){
   
            TreeNode node = queue.poll();//1 节点出队
            res.add(node.val);//将节点按顺序加入结果列表中
            if (node.left != null) queue.add(node.left);//如果下一层还有节点的话 将其入队
            if (node.right != null) queue.add(node.right);//下一层没节点的话 说明已经没有需要加入队列的节点了~
        }

        // 04 把列表转换成数组
        // 可以使用jdk8的新特性 stream流
        // return list.stream().mapToInt(Integer::intValue).toArray();
        // 但是上面这个速度会慢一些!
        int[] ans = new int[res.size()];//这个数组才符合输出条件~
        for (int i = 0; i <= res.size() - 1; i ++){
   
            ans[i] = res.get(i);//获取队列中的值 要使用.get(i) 
        } 
        return ans;
    }
}

102.二叉树的层序遍历

和上一题差不多意思~

102. 二叉树的层序遍历

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

输入:二叉树:[3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7

输出:

[
  [3],
  [9,20],
  [15,7]
]

解题思路

在树的遍历中 使用了 BFS(Breadth-First-Search) 也就是广度优先搜索算法解决

【1】特例处理 判断边界条件——根为空

【2】初始化 创建 存放每层节点的队列queue 结果列表res

Queue<TreeNode> queue = new LinkedList<>();
List<List<Integer>> res = new ArrayList();

别忘了根节点入队 queue.add(root);

【3】进行BFS广度优先搜索

{1}新建一个临时列表 用于存储当前层的打印结果

List<Integer> temp = new ArrayList<>();

{2}进行循环 把队列中的节点值 node.val 按序添加到临时列表temp的尾部 & 把加入列表节点的子节点加入到队列中

			for(int i = 0; i < levelNum; i++){
   
                //3 把队列中的元素加到临时列表中 
                TreeNode node = queue.
  • 12
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值