day21【代码随想录】二叉树的层序遍历、二叉树的层序遍历|| 、二叉树的层平均值 、二叉树的锯齿形层序遍历 、二叉树的右视图 、N叉树的层序遍历

news2024/11/25 20:39:56

文章目录

  • 前言
  • 一、二叉树的层序遍历(力扣102)
  • 二、二叉树的层序遍历||(力扣107)
  • 三、二叉树的层平均值(力扣637)
  • 四、二叉树的锯齿形层序遍历(力扣103)
  • 五、二叉树的右视图(力扣199)
  • 六、N叉树的层序遍历(力扣429)


前言

1、二叉树的层序遍历
2、二叉树的层序遍历||
3、二叉树的层平均值
4、二叉树的锯齿形层序遍历
5、二叉树的右视图
6、N叉树的层序遍历


一、二叉树的层序遍历(力扣102)

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

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {

    public List<List<Integer>> resList = new ArrayList<List<Integer>>();
    public List<List<Integer>> levelOrder(TreeNode root) {
        checkFun02(root);
        return resList;
    }
    public void checkFun02(TreeNode node){
        if(node==null){
            return ;
        }
        Queue<TreeNode> que = new LinkedList<TreeNode>();
        //根节点入队
        que.offer(node);
        while(!que.isEmpty()){
            List<Integer> itemList = new ArrayList<Integer>();
            int len = que.size();
            while(len-->0){
                //弹出结点
                TreeNode tmpNode = que.poll();
                //记录
                itemList.add(tmpNode.val);
                //左右孩子入队
                if(tmpNode.left!=null){
                    que.offer(tmpNode.left);
                }
                if(tmpNode.right!=null){
                    que.offer(tmpNode.right);
                }
            }
            resList.add(itemList);
        }
    }
}

借助队列实现

在这里插入图片描述

二、二叉树的层序遍历||(力扣107)

给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)
在这里插入图片描述
思路:
在(一)的基础上将最后的结果集翻转即可

class Solution {

    public List<List<Integer>> resList = new ArrayList<List<Integer>>();
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        checkFun(root);
        return resList;
    }
    public void checkFun(TreeNode root){
        if(root == null){
            return ;
        }
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int len =que.size();
            List<Integer> itemList = new ArrayList<>();
            while(len-->0){
                TreeNode tmpNode = que.poll();
                if(tmpNode.left!=null){
                    que.offer(tmpNode.left);
                }
                if(tmpNode.right!=null){
                    que.offer(tmpNode.right);
                }
                itemList.add(tmpNode.val);
            }
            resList.add(itemList);
        }
        Collections.reverse(resList);
    }
}

在这里插入图片描述

三、二叉树的层平均值(力扣637)

给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10-5 以内的答案可以被接受
在这里插入图片描述
思路:
在每一层结束时,直接求取平均值即可

class Solution {
    public List<Double> averageOfLevels(TreeNode root) {
        List<Double> resList = new ArrayList<>();
        if(root==null){
            return resList;
        }
        Queue<TreeNode> que = new LinkedList<>();
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            int size = len ;
            double levelSum=0.0;
            while(size-->0){
                TreeNode tmpNode = que.poll();
                if(tmpNode.left!=null){
                    que.offer(tmpNode.left);
                }
                if(tmpNode.right!=null){
                    que.offer(tmpNode.right);
                }
                levelSum +=tmpNode.val;
            }
            resList.add(levelSum/len);
        }
        return resList;
    }
}

在这里插入图片描述

四、二叉树的锯齿形层序遍历(力扣103)

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

思路:
起初自认为 分为奇偶层 奇数层(根节点为第一层)右孩子先入队然后再左孩子,偶数层左孩子先入队然后再右孩子。这个思路很明显是错误的
在这里插入图片描述
换一种思路,按照最开始的层序遍历,将偶数层翻转即可。

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

        List<List<Integer>> resList = new ArrayList<>();
        Queue<TreeNode> que = new LinkedList<>();
        int level =0;
        if(root==null){
            return resList;
        }
        que.offer(root);
        while(!que.isEmpty()){
            List<Integer> itemList = new ArrayList<>();
            int len = que.size();
            while(len-->0){
                TreeNode tmpNode = que.poll();
                if(tmpNode.left!=null){
                    que.offer(tmpNode.left);
                }
                if(tmpNode.right!=null){
                    que.offer(tmpNode.right);
                }
                itemList.add(tmpNode.val);
            }
            level++;
            if(level%2==0){
                Collections.reverse(itemList);
                resList.add(itemList);
            }else{
                resList.add(itemList);
            }
        }
        return resList;
    }
}

在这里插入图片描述

五、二叉树的右视图(力扣199)

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

思路:
正常的层序遍历 只不过当len==1时,记录当前结点的值

class Solution {
    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> resList = new ArrayList<>();
        Queue<TreeNode> que = new LinkedList<>();
        if(root==null){
            return resList;
        }
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            while(len>0){
                TreeNode tmpNode = que.poll();
                if(tmpNode.left!=null){
                    que.offer(tmpNode.left);
                }
                if(tmpNode.right!=null){
                    que.offer(tmpNode.right);
                }
                if(len==1){
                   resList.add(tmpNode.val);
                }
                len--;
            }
        }
        return resList;
    }
}

六、N叉树的层序遍历(力扣429)

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

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

在这里插入图片描述
思路:
和二叉树的层序遍历基本一致

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> resList = new ArrayList<>();
        Queue<Node> que = new LinkedList<>();

        if(root==null){
            return resList;
        }
        que.offer(root);
        while(!que.isEmpty()){
            int len = que.size();
            List<Integer> itemList = new ArrayList<>();
            while(len-->0){
                Node tmpNode = que.poll();
                for(int i=0;i<tmpNode.children.size();i++){
                    que.offer(tmpNode.children.get(i));
                }
                itemList.add(tmpNode.val);
            }
            resList.add(itemList);
        }
        return resList;
    }
}

在这里插入图片描述


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

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

相关文章

吃透Chisel语言.39.Chisel实战之单周期RISC-V处理器实现(一)——需求分析和初步设计

Chisel实战之单周期RISC-V处理器实现&#xff08;一&#xff09;——需求分析和初步设计 需求分析 首先明确我们要做的是什么&#xff0c;这个在标题里面已经说明了&#xff0c;我们要做的是一个单周期RISC-V处理器。 但光是个短语不足以支撑我们开展项目&#xff0c;我们需…

大数据学习:shell基础(3)

文章目录history命令参数说明任务一&#xff1a;查看历史操作记录任务二&#xff1a;查看最近10条历史命令任务三&#xff1a;查看最开始10条历史命令任务四&#xff1a;曾多少次使用vim编辑文本文件&#xff1f;任务五&#xff1a;执行历史第5条命令任务六&#xff1a;执行上一…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - Recurrent Neural NetWork(RNN)

文章目录一、Slot Filling二、Recurrent Neural NetWork&#xff08;RNN&#xff09;三、Bidirectional RNN&#xff08;双向RNN&#xff09;四、Long Short Term Memory&#xff08;LSTM&#xff09;五、Learning Target六、RNN 很难 Train七、Helpful Techniques7.1 LSTM7.2 …

CSDN竞赛14期·12月11日考试

CSDN竞赛14期12月11日考试 1、题目名称&#xff1a;字符串全排列 // 请关闭中文输入法&#xff0c;用英文的字母和标点符号。 // 如果你想运行系统测试用例&#xff0c;请点击【执行代码】按钮&#xff0c;如果你想提交作答结果&#xff0c;请点击【提交】按钮&#xff0c; //…

半入耳式蓝牙耳机哪款音质好?音质好的半入耳式蓝牙耳机推荐

对于喜欢听歌的朋友来讲&#xff0c;你只佛会关注到蓝牙耳机的佩戴舒适度&#xff0c;音质清晰这种情况&#xff0c;入耳式的带有耳塞&#xff0c;往往更加佩戴有更好的密闭性&#xff0c;半入耳的不完全进入耳道&#xff0c;佩戴更加舒适&#xff0c;下面整理了几款音质不错的…

[附源码]Python计算机毕业设计非处方药的查询与推荐系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Prometheus+Grafana监控一网打尽

PrometheusGrafana监控一、Prometheus介绍二、监控组件node-exportermysqld-exportercadvisorprometheus三、Grafana 展示平台docker启动配置Data sources导入Dashboard模板Linux主机监控Mysql监控Nginx监控Redis监控PostgreSQL监控Kafka监控ElasticSearch监控一、Prometheus介…

这四类项目经理一定带不好项目

项目经理就一定可以带好项目嘛&#xff1f;&#xff0c;当然不一定 失败的项目不少&#xff0c;除去一些本身就很坑的项目&#xff0c;大多项目失败&#xff0c;都和项目经理的个性有关。 也总结了2组极端特质&#xff1a; 第一&#xff0c;烂好人VS劳模型 第二&#xff0c;马…

[ vulhub漏洞复现篇 ] struts2远程代码执行漏洞s2-059(CVE-2019-0230)

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

JavaEE-多线程初阶3

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录volatile关键字wait 和 notify多线程案例单例模式饿汉模式懒汉模式volatile关键字 volatile : 易变的&#xff0c;易失的 vo…

关于实体类中VO、DTO、Entity的区别

关于实体类中VO、DTO、Entity的区别 1、entity 里的每一个字段&#xff0c;与数据库相对应&#xff0c; 2、vo 里的每一个字段&#xff0c;是和你前台 html 页面相对应&#xff0c; 3、dto 这是用来转换从 entity 到 vo&#xff0c;或者从 vo 到 entity 的中间的东西 。(DTO中拥…

leetcode: 1091. 二进制矩阵中的最短路径

1091. 二进制矩阵中的最短路径 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/shortest-path-in-binary-matrix/description/ 给你一个 n x n 的二进制矩阵 grid 中,返回矩阵中最短 畅通路径 的长度。如果不存在这样的路径,返回 -1 。 二进制矩阵中的 畅通…

刚刚接触编程,纠结应该先学Python还是Java?看完心里就有数了。

准备学习编程前&#xff0c;你一定会打开电脑搜索一下“先学Python还是先学Java&#xff1f;”扑面而来的是海量回答。 如果你问一名Java程序员&#xff0c;肯定会建议你先学Java&#xff0c;因为他们认为Python像个乳臭未干的黄毛小子。但如果你问Python程序员&#xff0c;可…

MacOS Ventura 13.1 (22C65) 正式版带 OC 0.8.7 and winPE 双分区原版黑苹果镜像

12 月 14 日&#xff0c;苹果向 Mac 电脑用户推送了 macOS 13.1 更新&#xff08;内部版本号&#xff1a;22C65&#xff09;&#xff0c;本次更新距离上次发布隔了 34 天。本次更新引入了无边记应用&#xff0c;旨在让用户在空白的白板式画布上进行素描、绘画和写作&#xff0c…

[附源码]Nodejs计算机毕业设计基于Web的在线音乐网站Express(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程。欢迎交流 项目运行 环境配置&#xff1a; Node.js Vscode Mysql5.7 HBuilderXNavicat11VueExpress。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分…

能力评估网站

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; (1)高校学生评估系统用户页面设计 前台页面主要是为用户设计&#xff0c;经过对用户和评估系统分析&#xff0c;目前主要…

足球视频位置与平面坐标的转换

依赖&#xff1a; C# OpenCVSharp WPF Numpy 目的&#xff1a;解决足球场上&#xff0c;人物投影到二维平面的位置坐标 图A / B/ C 一、基础概念 1.1标准球场的定义&#xff1a; 参考&#xff1a;https://zh.m.wikipedia.org/zh/%E8%B6%B3%E7%90%83%E5%A0%B4图 D 1.2 配准…

m软件接收机中同步技术以及LMS-RLS自适应均衡技术的matlab仿真

目录 1.算法描述 2.仿真效果预览 3.MATLAB核心程序 4.完整MATLAB 1.算法描述 自适应均衡属于自适应信号处理的应用范畴&#xff0c;各种各样的自适应均衡算法如迫零(ZF)算法、最小均方(LMS)算法、递归最小二乘(RLS)算法、变换域均衡算法、Bussgang算法、高阶或循环统计量算…

使用CreateJS实现一个【拯救球员】小游戏,快@你的小伙伴一起来玩儿吧

拯救球员游戏需求&#x1f447;核心玩法&#x1f447;&#x1f447;界面原型&#x1f447;&#x1f447;成品演示&#x1f447;游戏开发1.游戏素材准备2.代码实现1.创建index.html页面2.首页转场动画实现3.添加分数倒计时4.卡片排序展示5.游戏结束世界杯开赛前夕&#xff0c;球…

拷贝构造,赋值运算符重载(六千字长文详解!)

c之类和对象详解 拷贝构造&#xff0c;赋值运算符重载 文章目录c之类和对象详解 拷贝构造&#xff0c;赋值运算符重载拷贝构造拷贝构造特征拷贝构造的注意赋值运算符重载运算符重载赋值重载赋值运算符的写法注意赋值重载的默认性赋值重载和拷贝赋值的区别在哪里&#xff1f;拷贝…