算法day26

第一题

429. N 叉树的层序遍历

本题的要求我们可以通过队列来辅助完成层序遍历;

如下图的n叉树:

步骤一:

        我们定义一个队列,先进行根节点入队列操作;

步骤二:

        

        我们进行当前队列每一个元素的出队列操作,并将这个节点的值存放在tmp列表中;

步骤三:

        

        我们将上面根节点的子节点进行遍历,并一一放入到队列中,同时在进行出队列的时候,每出一个队列,该节点的值存放到tmp中,同时该节点的子节点也进行入队列操作;最后每一层的数值都会存放到惹他中,开始新的一层数据存储;

最后结束后如下图所示:

        

综上所述,代码如下:

/*
// Definition for a Node.
class Node {
    public int val;
    public List<Node> children;

    public Node() {}

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, List<Node> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> ret = new ArrayList<>();
        if(root == null) return ret;
        Queue<Node> q = new LinkedList<>();
        q.add(root);

        while(!q.isEmpty()){
            int sz = q.size();//当前队列里的节点个数
            List<Integer> tmp = new ArrayList<>();//用来统计本层的节点信息
            for(int i = 0; i<sz;i++){
                Node t = q.poll();
                tmp.add(t.val);
                for(Node child:t.children){
                    if(child != null) q.add(chile);
                }
            }
             ret.add(tmp);   
        }
        return ret;
    }
}

第二题

103. 二叉树的锯齿形层序遍历

        本题详细讲解如上题故事;

        至于区别就是从上往下数二叉树的偶数层,在放入到tmp表中之后进行逆转操作,然后将这些元素在放入到ret总表中,返回;

        综上所述,代码如下:

/**
 * 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>> zigzagLevelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<>();
        if(root == null) return ret;
        Queue<TreeNode> q = new LinkedList<>();
        q.add(root);
        int floor = 1;
        while(!q.isEmpty()){
            int sz = q.size();//当前队列里的节点个数,当前层李米娜有多少元素
            List<Integer> tmp = new ArrayList<>();//用来统计本层的节点信息
            for(int i = 0; i<sz;i++){
                TreeNode t = q.poll();
                tmp.add(t.val);
                if(t.left != null)q.add(t.left);
                if(t.right != null)q.add(t.right);
            }
            if(floor % 2 == 0) Collections.reverse(tmp);
            ret.add(tmp);
            floor ++;
        }
        return ret;
    }
}

 第三题

662. 二叉树最大宽度

下图两个实例如下所示:

  解法:利用数组存储二叉树的方式,给结点编号;(堆的思想)

堆的数据结构:Pair<TreeNode树的结点,Integer定义的下标>

        我们将每一层的这种堆结构的结点放入到队列中,则该层的宽度就是该层最右边的节点下标减去-该层最左边的节点下标+1;

        同时每一层的宽度计算完成后,就将下一层的结点覆盖到队列中,重复计算每一层的节点宽度,直到求出最大值;

        综上所述,代码如下:

/**
 * 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 int widthOfBinaryTree(TreeNode root) {
        List<Pair<TreeNode,Integer>> q = new ArrayList<>();//用数组模拟队列
        q.add(new Pair<TreeNode,Integer>(root,1));
        int ret = 0;//记录最终结果
        while(!q.isEmpty()){
            //先更新一下这一层的宽度
            Pair<TreeNode,Integer> t1 = q.get(0);
            Pair<TreeNode,Integer> t2 = q.get(q.size()-1);
            ret = Math.max(ret,t2.getValue() - t1.getValue() +1);
            //让下一层进队
            List<Pair<TreeNode,Integer>> tmp = new ArrayList<>();//用数组模拟队列
            for(Pair<TreeNode,Integer> t:q){
                TreeNode node = t.getKey();
                int index = t.getValue();
                if(node.left != null){
                    tmp.add(new Pair<TreeNode,Integer>(node.left,index*2));
                }
                 if(node.right != null){
                    tmp.add(new Pair<TreeNode,Integer>(node.right,index*2+1));
                }
            }
            q = tmp;
        }
        return ret;
    }
}

ps:本次的内容就到这里,如果对你有所帮助的话就请一键三连哦!!! 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

(科学:某天是星期几)泽勒一致性是由克里斯汀·泽勒开发的用于计算某天是星期几的算法。

(科学:某天是星期几)泽勒一致性是由克里斯汀泽勒开发的用于计算某天是星期几的算法。这个公式是: 其中: h是一个星期中的某一天(0 为星期六;1 为星期天;2 为星期一;3 为星期二;4 为 星期三;5 为星期四;6为星期五)。 q 是某月的第几天。 m 是月份(3 为三月&#xff0c;4 为四月,…

[数据集][目标检测]减速带检测数据集VOC+YOLO格式5400张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;5400 标注数量(xml文件个数)&#xff1a;5400 标注数量(txt文件个数)&#xff1a;5400 标注…

去掉eslint

1、在vue.config.js文件里加上下面的代码&#xff0c;然后重启就可以了&#xff01; 2、vue.config.js文件代码&#xff1a; const { defineConfig } require(vue/cli-service) module.exports defineConfig({transpileDependencies: true,lintOnSave: false })

Python基础教程(二十):SMTP发送邮件

&#x1f49d;&#x1f49d;&#x1f49d;首先&#xff0c;欢迎各位来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里不仅可以有所收获&#xff0c;同时也能感受到一份轻松欢乐的氛围&#xff0c;祝你生活愉快&#xff01; &#x1f49d;&#x1f49…

MySQL -- 事务

MySQL事务是数据库操作的一个重要概念&#xff0c;事务是指一组操作要么全部完成&#xff0c;要么全部不完成&#xff0c;是数据库的一个逻辑工作单元。事务的主要目的是确保数据库的一致性和可靠性。 事务是一组SQL语句的执行&#xff0c;要么全部成功&#xff0c;要么全部失…

【踩坑】解决运行一段时间GPU计算后忽然变得很慢

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 目录 发现问题 问题分析 修复思路 思路一 思路二 思路二对应代码 这个问题真的找了我好久&#xff0c;但说起来其实也简单&#xff0c;就是GPU温…

JDK8-17新特性

一、JDK8新特性:Lambda表达式 1.Lambda表达式及其使用举例 Lambda是一个匿名函数&#xff0c;我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格&#xff0c;使Java的语言表达能力…

17个有用的CLI命令

作为前端开发工程师&#xff0c;我们需要了解哪些命令&#xff1f;如果您熟悉这些命令&#xff0c;它们将大大提高您的工作效率。 1. tree 你们知道如何列出一个目录的文件结构吗&#xff1f;它在显示文件之间的目录关系方面做得很好 commands ├── a.js ├── b.js ├── …

PyTorch计算机视觉入门:从官方数据集到自定义数据集的获取

一、PyTorch与计算机视觉简介 PyTorch是一个开源的深度学习框架&#xff0c;其动态图的特性非常适合快速实验和模型原型设计。在计算机视觉任务中&#xff0c;如图像分类、目标检测、图像分割等&#xff0c;PyTorch提供了丰富的API和预训练模型&#xff0c;帮助开发者快速搭建…

C++ 不定参数模版

使用不定参数模版遇到一个小问题&#xff0c;做个记录 测试代码如下&#xff1a; template<typename T, typename ...Args> void pushToVectorIfParamIsStr(std::vector<std::string>& vec, T &&value,Args&&... args) {const bool is std:…

大模型中的计算精度——FP32, FP16, bfp16之类的都是什么???

大模型中的计算精度——FP32, FP16, bfp16之类的都是什么&#xff1f;&#xff1f;&#xff1f; 这些精度是用来干嘛的&#xff1f;&#xff1f;混合精度 mixed precision training什么是混合精度&#xff1f;怎么转换呢&#xff1f; 为什么大语言模型通常使用FP32精度训练量化…

调试了一下午,终于把tailwindcss搞进Blazor了

在Vue和Uniapp项目中使用tailwindcss后&#xff0c;实在是太香了&#xff0c;非常符合我这从XAML走过来的老程序员的手感&#xff0c;所以老想着在Blazor项目中引入。看了几个老外大佬的视频&#xff0c;调试了一下午&#xff0c;终于是捣鼓成功了。由于咱们Blazor项目不在node…

【c语言】文件操作,解开你的疑惑

文件操作 为什么使用文件什么是文件文件的分类文件名 二进制文件和文本文件文件的打开与关闭流与标准流流标准流 文件指针文件的打开与关闭 文件的顺序读写文件的随机读写文件读取结束的判定文件缓冲区 为什么使用文件 我们程序运行的数据是运行在内存中的&#xff0c;当成程序…

链表经典题目:环形链表问题(LeetCode141.环形链表、LeetCode142.环形链表Ⅱ)

&#x1f4c7;文章目录 &#x1f4dc; LeetCode141. 环形链表&#x1f536;题目描述&#x1f537;思路分析✔️代码实现 &#x1f4dc; LeetCode142.环形链表Ⅱ&#x1f536;题目描述&#x1f537;思路①✔️代码实现&#x1f537;思路② &#x1f4d2;总结 &#x1f4dc; Leet…

神经网络学习2

张量&#xff08;Tensor&#xff09;是深度学习和科学计算中的基本数据结构&#xff0c;用于表示多维数组。张量可以看作是一个更广义的概念&#xff0c;涵盖了标量、向量、矩阵以及更高维度的数据结构。具体来说&#xff0c;张量的维度可以是以下几种形式&#xff1a; 标量&am…

RabbitMQ实践——利用一致性Hash交换器做负载均衡

大纲 开启一致性Hash交换器创建交换器创建绑定关系测试参考资料 在《RabbitMQ实践——交换器&#xff08;Exchange&#xff09;和绑定&#xff08;Banding&#xff09;》中&#xff0c;我们熟悉了Direct、Fanout、Topic和Header这4种系统默认支持的交换器。这些交换器基本可以满…

Django REST framework关联序列化器详解:掌握复杂关系的序列化与反序列化艺术

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

军事武器3D数字化交互展示创作平台大大降低成本

军事力量和装备是一个国家国防安全的重要支柱&#xff0c;这在全球范围内得到广泛认同&#xff0c;为了让入伍的新兵能快速熟悉和掌握武器装备操作流程&#xff0c;基于创新型的华锐3D云展平台工具&#xff0c;搭建的3D军事武器展示搭建编辑器&#xff0c;让部队的军事武器展示…

Golang——gRPC gateway网关

前言 etcd3 API全面升级为gRPC后&#xff0c;同时要提供REST API服务&#xff0c;维护两个版本的服务显然不大合理&#xff0c;所以gRPC-gateway诞生了。通过protobuf的自定义option实现了一个网关。服务端同时开启gRPC和HTTP服务&#xff0c;HTTP服务接收客户端请求后转换为gr…

Javaweb8 数据库Mybatis+JDBC

Mybatis Dao层&#xff0c;用于简化JDBC开发 1步中的实体类 int类型一般用Integer &#xff1a;如果用int类型 默认值为0,会影响数据的判断,用Integer默认值是null,不会给数据的判断造成干扰 2.在application .properties里配置数据库的链接信息-四要素 #驱动类名称 #URL #用…