算法day26

news2024/11/15 12:22:26

第一题

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:本次的内容就到这里,如果对你有所帮助的话就请一键三连哦!!! 

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

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

相关文章

复旦大学首本大模型中文书太厉害啦!【大模型书籍推荐】

前言 在信息爆炸的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;技术如同璀璨的星辰&#xff0c;照亮了我们与机器沟通的道路。而今&#xff0c;复旦大学自然语言处理实验室的教授团队&#xff0c;如同航海家般&#xff0c;为我们带来了一本指引大语言模型领域前行…

[Java基础揉碎]网络相关概念

目录 网络通信 网络 ip地址 ​编辑 域名 ​编辑 网络协议 TCP和UDP 网络编程比较重要的的InetAddress类 Socket ​编辑 tcp字节流编程 案例一 案例二​编辑 案例三 网络上传文件 ​编辑​编辑 ​编辑 netstat tcp网络通信客户端也是通过端口和服务端进行通讯的…

python怎么保留小数

保留两位小数&#xff0c;并做四舍五入处理 方法一&#xff1a;使用字符串格式化 a 12.345 print("%.2f" % a)# 12.35 方法二&#xff1a;使用round内置函数 a 12.345 a1 round(a, 2) print(a1)# 12.35 方法三&#xff1a;使用decimal模块 from decimal import D…

每日一题39:甲板上的战舰

一、每日一题 题意 这题的标题应该是《棋盘上的战舰》&#xff0c;来源于 海战棋&#xff0c;把横着或竖着的连续 X 看成一艘战舰&#xff0c;统计棋盘上有多少艘战舰。 思路 战舰的个数&#xff0c;等于战舰「头部」的个数。如下图&#xff0c;我们只需要统计蓝色 X 的个数&…

LLM应用实战:当图谱问答(KBQA)集成大模型(三)

1. 背景 最近比较忙(也有点茫)&#xff0c;本qiang~想切入多模态大模型领域&#xff0c;所以一直在潜心研读中... 本次的更新内容主要是响应图谱问答集成LLM项目中反馈问题的优化总结&#xff0c;对KBQA集成LLM不熟悉的客官可以翻翻之前的文章《LLM应用实战&#xff1a;当KBQ…

Android 14 系统启动流程 之 启动init进程、启动Zygote进程

Android 14 系统启动流程 之 启动init进程、启动Zygote进程 废话不多说&#xff0c;先上图&#xff0c;不清楚的可以在评论区留言。

计算机体系结构学习(一)

计算机体系结构的发展 20 世纪五六十年代, 由于工艺技术的限制, 计算机都做得很简单, 计算机体系结构主要研究怎么做加减乘除, Computer Architecture 基本上等于 Computer Arithmetic。 20 世纪七八十年代的时候, 以精简指令集 (Reduced Instruction Set Computer, 简称 RISC…

AI大模型战场:通用大模型与垂直大模型的角逐

随着人工智能技术的迅猛发展&#xff0c;AI大模型已成为推动科技进步的重要力量。然而&#xff0c;在AI大模型的战场上&#xff0c;通用大模型与垂直大模型之间的分化日益明显。两者各有其独特的优势和潜力&#xff0c;在不同的应用场景中发挥着重要作用。那么&#xff0c;在这…

SSM 离散数学线上考试系统-计算机毕业设计源码83059

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;高校当然也不例外。离散数学线上考试系统是以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;采…

centos下创建raid6磁盘阵列

在CentOS系统中创建RAID 6阵列&#xff0c;可以使用mdadm工具。 以下是创建RAID 6阵列的基本步骤和示例代码&#xff1a; 安装mdadm工具&#xff08;如果尚未安装&#xff09;&#xff1a; sudo yum install mdadm 假设你有至少四个以上的磁盘设备&#xff08;例如 /dev/sdi…

信创4.0|暴雨出席空间智能软件技术交流会

6月19日&#xff0c;由自然资源部地理信息系统技术创新中心、中国测绘学会软件与信息技术服务工委会、内蒙古自治区测绘学会共同主办的“空间智能软件技术交流会暨自然资源数字化治理交流会”在呼和浩特举办&#xff0c;500余位嘉宾汇聚一堂&#xff0c;就空间智能赋能数字经济…

MyBatis的配置文件,即:src->main->resources的配置

目录 1、properties 标签 1.1 mybatis-config.xml 1.2 db.properties 1.3 在SqlMapConfig.xml 中 引入数据库配置信息 2、typeAliases 标签 2.1 定义别名 2.2 使用别名 3、Mappers标签 作用&#xff1a;用来在核心配置文件中引入映射文件 引入方式&#xff0c;有以下…

vue生成二维码中间自定义logo并截图分享

需求描述&#xff1a;在公众号中&#xff0c;生成二维码&#xff0c;并在二维码中央添加自定义logo&#xff0c;然后生成一张分享给好友的 二维码图片。 一、用到的依赖包 npm install --save html2canvas <script srchttps://cdn.staticfile.org/jquery/2.1.1/jquery.min…

【APP移动端自动化测试】第一节.环境配置和adb调试工具

文章目录 前言一、Java环境搭建二、AndroidSDK环境搭建三、Android模拟器安装四、adb调试工具基本介绍 4.1 adb构成和基本原理 4.2 adb获取包名&#xff0c;界面名 4.3 adb文件传输 4.4 adb获取app启动时间 4.5 adb获取手机日志 4.6 adb其他有关…

室内、户外安防监控超低功耗24g人体雷达感应模块,智能门铃、灯光控制新体验

在当今这个智能科技日新月异的时代&#xff0c;雷达感应模块正逐渐成为智能家居领域的一颗璀璨新星。其超低功耗、无误触、无漏触等特性&#xff0c;以及在户外环境下能够智能过滤环境干扰的独特优势&#xff0c;使得雷达感应模块在智能门铃、灯光照明等方面的应用越来越广泛。…

【C++】list 容器的增删改查---模拟实现(图例超详细解析!!!)

目录 一、前言 二、 list 容器的模拟实现思 ✨ 模块分析 ✨ 作用分析 三、list的节点类设计 四、list 的迭代器类设计 ⭐ 迭代器类--存在的意义 ⭐ 迭代器类--模拟实现 &#x1f4a6; 模板参数 和 成员变量 &#x1f4a6; 构造函数 &#x1f4a6; 运算符的重载 &…

如何一键式完成等级logistic回归分析?

Logistic回归分析用于研究X对Y的影响&#xff0c;并且要求Y必须为分类数据&#xff0c;并且根据Y的分类不同&#xff0c;需要选用不同的模型。 如果Y为二分类&#xff0c;如患病和不患病&#xff0c;那么普通的二元logistic回归就可以解决问题;如果Y为有序多分类&#xff0c;如…

如何成为嵌入式系统工程师?

各位朋友&#xff0c;如果你们有意向投身于嵌入式开发领域&#xff0c;那么强烈建议你们在软件和硬件两个方面均展开深入且全面的学习。 嵌入式计算机作为嵌入式系统的核心技术支撑&#xff0c;其是直接面向用户、产品以及应用的&#xff0c;无论是软件还是硬件方面都能发挥重要…

Windows10安装配置Docker客户端和WSL2与Hyper-V虚拟机

一、需求说明 需要在Windows系统中安装配置Docker的客户端,方便直接管理配置docker镜像容器内容。 二、Windows10安装Docker客户端步骤 2.1、下载安装Docker客户端 对于Windows 10以下的用户,推荐使用Docker Toolbox Windows安装文件:http://mirrors.aliyun.com/docker-…

附件采集文件类型识别方案

背景 咱们做爬虫的或多或少都会遇到附件下载&#xff0c;一般情况站点提供的附件链接会直接声明文件的类型&#xff0c;但是有些提供的只是一个api&#xff0c;然后触发下载时再返回附件文本&#xff0c;这个时候我们是没法直接知道文件类型的&#xff0c;而我们使用requests下…