【算法刷题 | 二叉树 02】3.21 二叉树的层序遍历01(5题:二叉树的层序遍历、层序遍历||、右视图、层平均值,以及N叉树的层序遍历)

news2024/9/30 13:27:44

文章目录

  • 5.二叉树的层序遍历
    • 5.1 102_二叉树的层序遍历
      • 5.1.1问题
      • 5.1.2解法:队列
    • 5.2 107_二叉树的层序遍历||
      • 5.2.1问题
      • 5.2.2解法:队列
    • 5.3 199_二叉树的右视图
      • 5.3.1问题
      • 5.3.2解决:队列
    • 5.4 637_二叉树的层平均值
      • 5.4.1问题
      • 5.4.2解决:队列
    • 5.5 429_N叉树的层序遍历
      • 5.5.1问题
      • 5.5.2解法:层序遍历+栈

5.二叉树的层序遍历

5.1 102_二叉树的层序遍历

5.1.1问题

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

102.二叉树的层序遍历

5.1.2解法:队列

  1. 层序遍历需要借用一个辅助数据结构,即 队列 来实现
  2. 队列先进先出,符合一层一层遍历的逻辑
  3. 首先将根节点添加到队列中,接着开启一个循环(只要队列不为空,就一直循环)
    1. 在每次循环中,先拿到此时队列的长度
    2. 接着依次取出此时队列的全部节点(先进先出),并处理该元素
    3. 若该节点的左孩子不为空,则添加进队列;若该节点的右孩子不为空,则添加进队列
    4. 每次循环中,将处理完的list数组添加到返回值即可

102二叉树的层序遍历

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {

        //1、借助队列实现:先进先出
        Queue<TreeNode> queue=new LinkedList<>();
        List<List<Integer>> list=new ArrayList<>();
        if(root==null){
            return list;
        }

        //添加根节点到队列
        queue.offer(root);
        while(!queue.isEmpty()){
            //只要队列不为空,就一直循环
            List<Integer> tmp=new ArrayList<>();
            //取出队列全部元素
            int len=queue.size();
            while(len>0){
                
                TreeNode node=queue.poll();
                //添加值
                tmp.add(node.val);                                 
                
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
                len--;
            }
            
            list.add(tmp);
        }
        return list;

        
    }
}

5.2 107_二叉树的层序遍历||

5.2.1问题

给定一个二叉树,返回其 节点值自底向上 的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

107.二叉树的层次遍历II

5.2.2解法:队列

  1. 思路:跟上一题一样,使用队列解决
  2. 由于是自底向上,所以结果反转list即可
class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        Queue<TreeNode> queue=new LinkedList<>();
        List<List<Integer>> list=new ArrayList<>();
        if(root==null){
            return list;
        }
        queue.offer(root);
        while(!queue.isEmpty()){
            //遍历该层
            List<Integer> tmp=new ArrayList<>();
            int len=queue.size();
            while(len>0){
                TreeNode node=queue.poll();
                tmp.add(node.val);
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
                len--;
            }

            //将该层结果添加到返回list中
            list.add(tmp);
        }

        //反转,也可以新建一个list,从后往前遍历原来的list
        Collections.reverse(list);
        return list;
        
    }
}

5.3 199_二叉树的右视图

5.3.1问题

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

  • 示例一:

img

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

5.3.2解决:队列

  1. 思路:层序遍历,将每层的最右节点添加到返回list中即可
class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        Queue<TreeNode> queue=new LinkedList<>();
        List<Integer> list=new ArrayList<>();

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

        queue.offer(root);
        while(!queue.isEmpty()){
            int len=queue.size();
            for(int i=0;i<len;i++){
                
                TreeNode node=queue.poll();
                if(i==len-1){
                    //每层的最后一个
                    list.add(node.val);
                }

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

5.4 637_二叉树的层平均值

5.4.1问题

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受。

  • 示例一:

img

输入:root = [3,9,20,null,null,15,7]
输出:[3.00000,14.50000,11.00000]
解释:第 0 层的平均值为 3,第 1 层的平均值为 14.5,第 2 层的平均值为 11 。
因此返回 [3, 14.5, 11] 。

5.4.2解决:队列

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {

        Queue<TreeNode> queue=new LinkedList<>();
        List<Double> list=new ArrayList<>();
        if(root==null){
            return list;
        }
        queue.offer(root);
        while(!queue.isEmpty()){
            //遍历该层
            int len=queue.size();
            Double tmp=0.0;

            for(int i=0;i<len;i++){
                TreeNode node=queue.poll();
                tmp+=node.val;
                if(node.left!=null){
                    queue.offer(node.left);
                }
                if(node.right!=null){
                    queue.offer(node.right);
                }
            }

            //将该层结果添加到返回list中
            list.add(tmp/len);
        }

        return list;
    }
}

5.5 429_N叉树的层序遍历

5.5.1问题

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

  • 示例一:

img

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

5.5.2解法:层序遍历+栈

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        Queue<Node> queue=new LinkedList<>();
        List<List<Integer>> list=new ArrayList<>();
        if(root==null){
            return list;
        } 
        queue.offer(root);
        while(!queue.isEmpty()){
            int len=queue.size();
            List<Integer> tmp=new ArrayList<>();
            while(len>0){
                Node node=queue.poll();
                tmp.add(node.val);
                
                //由左右节点变成孩子节点
                List<Node> childrens=node.children;
                for(Node children:childrens){
                    if(children!=null){
                        queue.offer(children);
                    }
                }
                len--;
            }
            list.add(tmp);
        }
        return list;
    }
}

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

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

相关文章

VScode通过ssh连接github

通过ssh连接github 1.生成公钥和私钥2.设置config文件3.配置ssh免密登录4.远程仓库初始化 1.生成公钥和私钥 首先选择一个文件夹&#xff0c;右击 git bash here&#xff0c;在命令行输入命令&#xff0c;按下三次回车生成一个**.ssh文件夹**&#xff0c;一般在用户的user根目…

跳过mysql权限验证来修改密码-GPT纯享版

建议重新配置一遍&#xff0c;弄成功好多次了&#xff0c;每次都出bug&#xff0c;又要重新弄&#xff0c;不是过期就是又登不进去了&#xff0c;我服了 电脑配置MySQL环境&#xff08;详细&#xff09;这个哥们的10min配完&#xff0c;轻轻松松&#xff0c; 旧方法&#xff…

第十四届蓝桥杯JavaB组省赛真题 - 幸运数字

进制转换可以参考如下的十进制&#xff0c;基本一样的&#xff0c;只是把10变成了其他数字&#xff0c; sum就是各个数位之和 public static int myUtil(int n) {int sum 0;while(n > 0) {sum n % 10;n / 10;}return sum;} 注意&#xff1a; 如果写在同一个类里面&…

北京中科富海低温科技有限公司确认出席2024第三届中国氢能国际峰会

会议背景 随着全球对清洁能源的迫切需求&#xff0c;氢能能源转型、工业应用、交通运输等方面具有广阔前景&#xff0c;氢能也成为应对气候变化的重要解决方案。根据德勤的报告显示&#xff0c;到2050年&#xff0c;绿色氢能将有1.4万亿美元市场。氢能产业的各环节的关键技术突…

Gavin Wood 精彩演讲|安全灵活 JAM 链,打造去中心化多核计算机

Polkadot 年度开发者大会 sub0 Asia 近期在泰国曼谷正式落幕。面对区块链行业的激烈竞争&#xff0c;Polkadot 创始人 Gavin Wood 在演讲中说明将如何利用 Polkadot 2.0 与 JAM 链带来新的技术创新&#xff0c;推动生态持续发展。 Polkadot 将推一个名为 JAM 链的新网络。JAM …

Nature:“量子龙卷风”首次模拟黑洞

科学家们在超流体氦气中首次创造出了一个巨大的“量子漩涡”&#xff08;quantum vortex&#xff09;&#xff0c;用以模拟黑洞。这一成就不仅使他们能够更加细致地观察模拟黑洞的行为&#xff0c;还能探究其与周围环境的交互作用。 诺丁汉大学的研究团队与伦敦国王学院和纽卡斯…

python - 更改pdf中文本的字体高亮颜色(fitz模块)

import fitzdoc fitz.open(r"e:/test.pdf") pagedoc[0]# 按照指定的位置设置颜色 highlight page.add_highlight_annot((20, 500,60, 520)) highlight.set_colors(stroke[1, 1, 0]) # light red color (r, g, b) 颜色rgb每个除以255得出 highlight.update()# 按照…

序列的使用

目录 序列的创建 序列的使 Oracle从入门到总裁:​​​​​​https://blog.csdn.net/weixin_67859959/article/details/135209645 在许多数据库之中都会存在有一种数据类型 — 自动增长列&#xff0c;它能够创建流水号。如果想在 Oracle 中实现这样的自动增长列&#xff0c;可…

学习几个地图组件(基于react)

去年开发时用的公司封装的地图组件&#xff0c;挺方便的&#xff0c;但是拓展性不强&#xff0c;所以看看有哪些优秀的开源地图组件吧 1、React Leaflet 介绍&#xff1a;开源的JavaScript库&#xff0c;用于在web上制作交互式地图&#xff0c;允许你使用React组件的方式在应…

基于JavaWeb+BS架构+SpringBoot+Vue+O2O生鲜食品订购小程序系统的设计和实现

基于JavaWebBS架构SpringBootVueO2O生鲜食品订购小程序系统的设计和实现 文末获取源码Lun文目录前言主要技术系统设计功能截图 文末获取源码 Lun文目录 目 录 摘 要 I Abstract II 1 绪 论 1 1.1课题研究背景及意义 1 1.2研究现状 1 1.3本论文的主要论文结构 3 2系统相关技术…

03-Java面试题八股文-----java基础——10题

41、HashMap 的长度为什么是 2 的 N 次方呢&#xff1f; 为了能让 HashMap 存数据和取数据的效率高&#xff0c;尽可能地减少 hash 值的碰撞&#xff0c;也就是说尽量把数据能均匀的分配&#xff0c;每个链表或者红黑树长度尽量相等。 我们首先可能会想到 % 取模的操作来实现。…

鸿蒙Harmony应用开发—ArkTS(@Builder装饰器:自定义构建函数)

前面章节介绍了如何创建一个自定义组件。该自定义组件内部UI结构固定&#xff0c;仅与使用方进行数据传递。ArkUI还提供了一种更轻量的UI元素复用机制Builder&#xff0c;Builder所装饰的函数遵循build()函数语法规则&#xff0c;开发者可以将重复使用的UI元素抽象成一个方法&a…

代码+视频,R语言logistic回归交互项(交互作用)的可视化分析

交互作用效应(p for Interaction)在SCI文章中可以算是一个必杀技&#xff0c;几乎在高分的SCI中必出现&#xff0c;因为把人群分为亚组后再进行统计可以增强文章结果的可靠性&#xff0c;不仅如此&#xff0c;交互作用还可以使用来进行数据挖掘。在既往文章中&#xff0c;我们已…

AJAX踩坑指南(知识点补充)

JWT JSON Web Token是目前最为流行的跨域认证解决方案 如何获取&#xff1a;在使用JWT身份验证中&#xff0c;当用户使用其凭据成功登录时&#xff0c;将返回JSON Web Token(令牌&#xff09; Token本质就是一个包含了信息的字符串 如何获取Token:登录成功之后&#xff0c;服务…

论文阅读之LORA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS(2021)

文章目录 论文地址主要内容主要贡献模型图技术细节实验结果 论文地址 LORA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS 主要内容 这篇文章的主要内容是介绍了一种名为LoRA&#xff08;Low-Rank Adaptation&#xff09;的技术&#xff0c;这是一种针对大型语言模型进行…

0201线性方程组和矩阵-矩阵及其运算-线性代数

文章目录 一、线性方程组二、矩阵的定义结语 一、线性方程组 设有 n 个未知数 m n个未知数m n个未知数m个方程的线性方程组 { a 11 x 1 a 12 x 2 ⋯ a 1 n x n b 1 , a 21 x 1 a 22 x 2 ⋯ a 2 n x n b 2 , ⋯ a m 1 x 1 a m 2 x 2 ⋯ a m n x n b m , \begin{ca…

Microsoft Edge 中的 Internet Explorer 模式解决ie禁止跳转到edge问题

作为网工&#xff0c;网络中存在很老的设备只能用ie浏览器访问打开&#xff0c;但是win10后打开Internet Explorer 会强制跳转到Edge 浏览器&#xff0c;且有人反馈不会关&#xff0c;为此找到了微软官方的Microsoft Edge 中的 Internet Explorer 模式&#xff0c;可以直接在Mi…

Pytest测试框架+allure+jenkins自动化持续集成

Pytest是python的一种单元测试框架&#xff0c;可通过pytest 目录路径来运行测试用例 可以通过断言assert来测试是否通过 1.pytest测试用例命名规范 需严格遵循此规范&#xff0c;不然使用 pytest 目录 来运行会找不到该条测试用例。 可通过这样定义main函数&#xf…

OpenHarmony游戏应用程序-实现的一个手柄游戏

介绍 本篇Codelab是基于TS扩展的声明式开发范式编程语言&#xff0c;以及OpenHarmony的分布式能力实现的一个手柄游戏。 说明&#xff1a; 本示例涉及使用系统接口&#xff0c;需要手动替换Full SDK才能编译通过。 完成本篇Codelab需要两台开发板&#xff0c;一台开发板作为游…

python 函数(解包**、互相调用、作用域、函数的封装、内置函数:eval()、zip()、文件处理open())

函数解包 """ 1、函数的注释&#xff1a;参数和返回值 在注释里可以自动添加显示&#xff0c;只需手动加说明。2、函数的解包【拆包】&#xff1a;函数的参数要传递数据有多个值的时候&#xff0c;中间步骤拿到数据 保存在元组或者列表 或者字典里。 - 传递参数…