LeetCode:102. 二叉树的层序遍历

news2024/9/21 8:03:53
🍎道阻且长,行则将至。🍓

🌻算法,不如说它是一种思考方式🍀


算法专栏: 👉🏻123

可以参考👉LeetCode:二叉树的前、中、后序遍历——如何创建一棵【二叉树】


一、🌱102. 二叉树的层序遍历

  • 题目描述:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。
  • 来源:力扣(LeetCode)
  • 难度:中等
  • 提示:
    树中节点数目在范围 [0, 2000] 内
    -1000 <= Node.val <= 1000
  • 示例

在这里插入图片描述

🌴解题

1.递归法

也就是使用先序遍历,根据对每一层的深度来考虑增加集合元素,原理是很简单的,判断好递归何时结束即可。

  • code
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        int deepth=1;
        List<List<Integer>> ans=new ArrayList<>();//保存输出结果的集合
        if(root==null)
            return ans;
        List<Integer> list=new ArrayList<>();//每一层的临时集合
        visit(root,list,ans,deepth);//开始遍历
        return ans;
    }

    private static void visit(TreeNode node, List<Integer> list,List<List<Integer>> ans, int deepth) {
        if(node!=null) {//当前节点,以及是否可以继续下行
            if (ans.size() >= deepth)
                ans.get(deepth-1).add(node.val);
            else {
                list.add(node.val);
                ans.add(new ArrayList<>(list));
                list.clear();
            }
			//左右子树进递归
            visit(node.left, list,ans, deepth + 1);
            visit(node.right, list, ans, deepth + 1);
        }
    }
}

在这里插入图片描述

2.迭代法

使用一个队列来进行节点进队,仍然是先序遍历。这里使用到两个集合(一个最后的结果,一个是每一层的)和一个队列的数据结构。
可以用语言描述:
1、根节点入队;
2、然后在循环中是每次 判断 队列是否有节点(没有节点了代表遍历结束了)while;
   2.1、计算出队长为 n
   2.2、对队列进行n次出队 for:
      a、取出队的元素—— node
      b、每一层的集合—— add(node值);
      c、如果node有左右子节点:
         左右节点 顺序进队
   2.3、结果的集合—— add(层集合值);
结束

  • code
class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> resultList = new ArrayList<>();
        Queue<TreeNode> queue = new LinkedList<>();

        if(root == null) {
            return resultList;
        }

        queue.offer(root);

        while(!queue.isEmpty()) {
            int currentLevelSize = queue.size();
            List<Integer> currentLevel = new ArrayList<>();

            for(int i = 0; i < currentLevelSize; i++) {
                TreeNode node = queue.poll();
                currentLevel.add(node.val);

                if(node.left != null) {
                    queue.offer(node.left);
                }
                if(node.right != null) {
                    queue.offer(node.right);
                }
            }
            resultList.add(currentLevel);
        }
        return resultList;
    }
}

在这里插入图片描述


东风夜放花千树,更吹落、星如雨。—— 辛弃疾

返回第一页。☝


☕物有本末,事有终始,知所先后。🍭

🍎☝☝☝☝☝我的CSDN☝☝☝☝☝☝🍓


附:完整从数组建立树的运行代码

package code;

import java.util.ArrayList;
import java.util.List;


public class c102 {
    public static void main(String[] args) {
        char[] root1 = {3,9,20,5,' ',15,7};
        TreeNode102 root = new TreeNode102();
        creatNode(root, root1, 0);

        List list = Solution102.levelOrder(root);
        for (Object o : list) {
            System.out.print(o);
        }
    }

    public static void creatNode (TreeNode102 p,char[] root1, int i){
        if (i >= root1.length)
            return;
        p.setVal(root1[i]);//父节点

        if (i * 2 + 1 < root1.length) {
            //左子树  *2+1
            if (root1[i * 2 + 1] != ' ') {
                p.left = new TreeNode102();
                creatNode(p.left, root1, i * 2 + 1);
            } else p.left = null;
        }

        if (i * 2 + 2 < root1.length) {
            //右子树  *2+2
            if (root1[i * 2 + 2] != ' ') {
                p.right = new TreeNode102();
                creatNode(p.right, root1, i * 2 + 2);
            } else p.right = null;
        }

    }
}

/**
 * 层序遍历
 */
class Solution102 {
    public static List<List<Integer>> levelOrder(TreeNode102 root) {
        int deepth=1;
        List<List<Integer>> ans=new ArrayList<>();
        if(root==null)
            return ans;
        List<Integer> list=new ArrayList<>();
        visit(root,list,ans,deepth);

        return ans;
    }

    private static void visit(TreeNode102 node, List<Integer> list,List<List<Integer>> ans, int deepth) {
        if(node!=null) {
            if (ans.size() >= deepth)
                ans.get(deepth-1).add(node.val);
            else {
                list.add(node.val);
                ans.add(new ArrayList<>(list));
                list.clear();
            }

            visit(node.left, list,ans, deepth + 1);
            visit(node.right, list, ans, deepth + 1);
        }
    }
}



class TreeNode102 {
    int val;
    code.TreeNode102 left;
    code.TreeNode102 right;

    TreeNode102() {
    }

    TreeNode102(int val) {
        this.val = val;
    }

    TreeNode102(int val, code.TreeNode102 right, code.TreeNode102 left) {
        this.val = val;
        this.left = left;
        this.right = right;
    }

    public void setVal(int val) {
        this.val = val;
    }

    public void setLeft(code.TreeNode102 left) {
        this.left = left;
    }

    public void setRight(code.TreeNode102 right) {
        this.right = right;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/432083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习 特征工程

文章目录 一、数据预处理1. 缺失值处理1.1 删除1.2 统计值填充1.3 前后向值填充1.4 直接忽略1.5 模型预测 2. 异常值处理 二、特征提取1. 数值型特征提取1.1 标准化与缩放1.1.1标准化&#xff08;Standardization&#xff09;1.1.2 归一化&#xff08;Normalization&#xff09…

STM32F4_定时器精讲(TIM)

目录 1. 什么是定时器&#xff1f; 2. STM32定时器简介 2.1 高级控制定时器 TIM1和TIM8 2.1.1 TIM1和TIM8简介 2.1.2 时基单元 2.1.3 计数器模式 2.1.4 重复计数器 2.1.5 时钟选择 2.1.6 捕获/比较通道 2.1.7 输入捕获模式 2.1.8 其他功能 2.2 通用定时器 TIM2到TI…

算法----删点成林

题目 给出二叉树的根节点 root&#xff0c;树上每个节点都有一个不同的值。 如果节点值在 to_delete 中出现&#xff0c;我们就把该节点从树上删去&#xff0c;最后得到一个森林&#xff08;一些不相交的树构成的集合&#xff09;。 返回森林中的每棵树。你可以按任意顺序组…

2023年天梯赛模拟赛

//能力有限&#xff0c;只展示一百分代码。前八个题一般是原题&#xff0c;所以不展示题目。 L1-1 嫑废话上代码 #include<bits/stdc.h> using namespace std; int main(){cout<<"Talk is cheap. Show me the code.";return 0; } L1-2 九牛一毛 这是…

Leetcode每日一题——“移除元素”

各位CSDN的uu们你们好呀&#xff0c;小雅兰又来啦&#xff0c;今天&#xff0c;小雅兰的内容是移除元素&#xff0c;下面&#xff0c;让我们进入Leetcode的世界吧 说明: 为什么返回数值是整数&#xff0c;但输出的答案是数组呢? 请注意&#xff0c;输入数组是以「引用」方式…

ChatGPT | 使用new bing的简易教程

1. 教程参考&#xff1a; https://juejin.cn/post/7199557716998078522 2.在参考上述教程遇到的问题与解决 2.1 下载dev浏览器的网址打不开 egde dev下载地址&#xff08;上面网站上的&#xff09;我电脑打不开 换用下面的网址即可 https://www.microsoftedgeinsider.com/z…

在three.js中废置对象

基于three.js子如何废置对象(How to dispose of objects) 前言: 为了提高性能,并避免应用程序中的内存泄露,一个重要的方面是废置未使用的类库实体。 每当创建一个three.js中的实例时,都会分配一定数量的内存。然而,three.js会创建在渲染中所必需的特定对象, 例如几何…

4.11、socket地址

4.11、socket地址1.通用 socket 地址2.专用socket地址1.通用 socket 地址 socket 网络编程接口中表示 socket 地址的是结构体 sockaddr&#xff0c;其定义如下&#xff1a; // socket地址其实是一个结构体&#xff0c;封装端口号和IP等信息。后面的socket相关的api中需要使用…

【c语言】每日一题之汉诺塔类型

目录 前言题目说明描述 题目分析汉诺塔问题 题目代码展示 前言 大佬们&#xff0c;我又回来了&#xff0c;最近也在忙自己的学业&#xff0c;忙着生活对线&#xff0c;也参加了今年的蓝桥杯其他的组&#xff0c;发现今年太难了 &#xff0c;摆烂了。但我想到了读者你们&#x…

前端面试之JavaScript题目,简单全面(持续更新ing...)

数据类型 1.JavaScript有哪些数据类型&#xff0c;它们的区别&#xff1f; 类型&#xff1a;JavaScript共有8种数据类型&#xff0c;undefined&#xff0c;null&#xff0c;Boolean&#xff0c;string&#xff0c;number&#xff0c;bigint&#xff0c;symbol&#xff0c;obj…

K-计算面积

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 题目描述 小w给你三种图形&#xff0c;可能是平行四边形&#xff0c;三角形&#xff0c;梯形&#xff0c;对于给定的TTT个图形&#xff0c;你需要依次回答每个图形的面积&#xff0c;保证答案…

《LeetCode》——LeetCode刷题日记

本期&#xff0c;将给大家带来的是关于 LeetCode 的关于二叉树的题目讲解。 目录 &#xff08;一&#xff09;606. 根据二叉树创建字符串 &#x1f4a5;题意分析 &#x1f4a5;解题思路 &#xff08;二&#xff09;102. 二叉树的层序遍历 &#x1f4a5;题意分析 &#…

docker stats 命令详解

docker stats : 显示容器资源的使用情况&#xff0c;包括&#xff1a;CPU、内存、网络 I/O 等。 docker stats [OPTIONS] [CONTAINER...]OPTIONS 说明&#xff1a; –all , -a :显示所有的容器&#xff0c;包括未运行的。 –format :指定返回值的模板文件。 –no-stream :展…

( “树” 之 BFS) 637. 二叉树的层平均值 ——【Leetcode每日一题】

637. 二叉树的层平均值 给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 1 0 − 5 10^{-5} 10−5 以内的答案可以被接受。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;[3.00000,14.50000,1…

060202体积弧长-定积分在几何学上的应用-定积分的应用

文章目录 2 体积2.1 旋转体的体积2.2 平行截截面面积已知的立体的体积2.3 例题 3 平面曲线的弧长2.1 直接坐标系2.2 参数方程2.3 极坐标系 结语 2 体积 2.1 旋转体的体积 情形①平面图形由 y f ( x ) , y 0 , x a , x b yf(x),y0,xa,xb yf(x),y0,xa,xb所围成&#xff0c;…

LeetCode——1041. 困于环中的机器人

一、题目 在无限的平面上&#xff0c;机器人最初位于 (0, 0) 处&#xff0c;面朝北方。注意: 北方向是y轴的正方向。 南方向是y轴的负方向。 东方向是x轴的正方向。 西方向是x轴的负方向。 机器人可以接受下列三条指令之一&#xff1a; “G”&#xff1a;直走 1 个单位 “L”…

seata1.5.2+nacos2.10配置教程

seata1.5.2配置教程本文基于nacos2.1.0mysql8.0seata1.5.21.下载安装包 官网&#xff1a;http://seata.io/zh-cn/blog/download.html seata目录结构如图&#xff1a; 2.主要需要修改的配置文件是\seata\conf\application.yml,可参考示例application.example.yml server:port:…

SpringBoot项目集成JMH测试用例

SpringBoot项目集成JMH测试用例1. JMH2. JMH使用2.1 pom引用JMH2.2 BaseBenchmark3. 部分注解介绍4. Jenkins 集成 JMH4.1 下载插件配置Job1. JMH JMH&#xff08;Java Microbenchmark Harness&#xff09;是一个 Java 工具&#xff0c;用于构建、运行和分析用 Java 和其他针对…

【redis】缓存双写一致性之工程落地实现(下)

【redis】缓存双写一致性之工程落地实现&#xff08;下&#xff09; 本篇由于没有进行实操&#xff0c;所以没有记录详细的配置内容 文章目录 【redis】缓存双写一致性之工程落地实现&#xff08;下&#xff09;本篇由于没有进行实操&#xff0c;所以没有记录详细的配置内容 前…

树莓派 GPIO口控制双色LED灯

目录 一、首先加载库 二、设置编码规范 三、去除GPIO口警告 四、进行详细编程 五、程序源码 GPIO&#xff08;General Purpose I/O Ports&#xff09;意思为通用输入/输出端口&#xff0c;通过它们可以输出高低电平或者通过它们读入引脚的状态&#xff08;是高电平或是低电…