每日5题Day22 - LeetCode 106 - 110

news2025/3/1 13:18:07

每一步向前都是向自己的梦想更近一步,坚持不懈,勇往直前!

第一题:106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)

class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        Map<Integer, Integer> map = new HashMap<>();
        //把中序每个点都记录下来
        for(int i = 0; i < inorder.length; i++){
            map.put(inorder[i], i);
        }
        //传入后序的最后一个节点,因为是根节点
        TreeNode head = helper(0, inorder.length - 1, map, postorder, postorder.length - 1);
        return head;
    }

    private static TreeNode helper(int low, int high, Map<Integer, Integer> map, int[] postorder, int idx){
        if(low > high){
            return null;
        }
        //找到对应的值
        int val = postorder[idx];
        //在中序中找到分割点
        int index = map.get(val);
        TreeNode node = new TreeNode(val);
        //递归找到左右子树
        node.left = helper(low, index - 1, map, postorder, idx - (high - index) - 1);
        node.right = helper(index + 1, high, map, postorder, idx - 1);
        return node;
    }
}

第二题:107. 二叉树的层序遍历 II - 力扣(LeetCode)

class Solution {
    public List<List<Integer>> levelOrderBottom(TreeNode root) {
        //就是使用栈每次把每一层记录下来,最后逆序输出
        //本质上还是属于层序遍历
        List<List<Integer>> res = new ArrayList<>();
        if(root == null){
            return res;
        }
        Deque<TreeNode> stack = new ArrayDeque<>();
        stack.offer(root);
        while(!stack.isEmpty()){
            List<Integer> tmp = new ArrayList<>();
            int size = stack.size();
            for(int i = 0; i < size; i++){
                TreeNode cur_node = stack.poll();
                tmp.add(cur_node.val);
                if(cur_node.left != null){
                    stack.offer(cur_node.left);
                }
                if(cur_node.right != null){
                    stack.offer(cur_node.right);
                }
            }
            res.add(0,tmp);
        }
        return res;
    }
}

第三题:108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode)

class Solution {
    public TreeNode sortedArrayToBST(int[] nums) {
        //题目提到有序,二叉,高度要平衡,
        //相当于每次我们找到节点都是要中间节点
        //随后向两边扩散,所以创建二叉搜索树的时候一定要二叉
        return helper(nums, 0 , nums.length - 1);
    }

    private TreeNode helper(int[] nums, int left, int right){
        if(left > right){
            return null;
        }
        //找到中间节点
        int mid = left + (right - left) / 2;
        TreeNode node = new TreeNode(nums[mid]);
        //递归
        node.left = helper(nums, left, mid - 1);
        node.right = helper(nums, mid + 1, right);
        //注意是返回某个节点
        return node;
    }
}

第四题:109. 有序链表转换二叉搜索树 - 力扣(LeetCode)

class Solution {
    public TreeNode sortedListToBST(ListNode head) {
        if (head == null) {
            return null; // 基本情况
        }
        return convertToBST(head, null);
    }

    private TreeNode convertToBST(ListNode head, ListNode tail) {
        if (head == tail) {
            return null; // 基本情况:子列表为空
        }
        //使用快慢指针来实现二分中查找中位的过程
        ListNode slow = head;
        ListNode fast = head;
        while (fast != tail && fast.next != tail) {
            slow = slow.next;
            fast = fast.next.next;
        }

        TreeNode root = new TreeNode(slow.val);
        root.left = convertToBST(head, slow);
        root.right = convertToBST(slow.next, tail);
        
        return root;
    }
}

 第五题:110. 平衡二叉树 - 力扣(LeetCode)

class Solution {
    public boolean isBalanced(TreeNode root) {
        //对于每一个点进行递归判断
        return getH(root) != -1;
    }

    private static int getH(TreeNode node){
        //对于每一个特定的点,如果为空则高度为0
        if(node == null){
            return 0;
        }
        //找到左边,如果左边不满足,则自身也不满足
        int left = getH(node.left);
        if(left == -1){
            return -1;
        }
        //同理,右边同样逻辑
        int right = getH(node.right);
        if(right == -1){
            return -1;
        }
        //注意下面判别式,判断左右高度差值是否大于1
        //大了肯定不满足了
        //否则我们给出一个最大高度
        if(Math.abs(left - right) > 1){
            return -1;
        }else{
            return Math.max(left, right) + 1;
        }
    }
}

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

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

相关文章

质数(素数)的几种判断方法

判断一个数是否为质数/合数是在数据处理中经常遇到的问题&#xff0c;如何解决这个问题&#xff0c;作者总结了如下几种算法。 质数的定义&#xff1a; 一个数如果除了1 和 其本身外&#xff0c;不能被其它数整除&#xff0c;就称这个数为质数&#xff08;或素数&#xff09;…

【计算机体系结构复习】

一.选择题&#xff08;2 X 15) 第五章第六章没有 第一章 第二章 第三章 第四章 第七章 第八章 二.主观题 第一章 1.7 1.11 怎么计算程序执行时间CPI、MIPS CPI变化&#xff0c;系统性能怎么变&#xff08;上课例子&#xff09; p9 例1.3 第二章 哈夫曼…

CVE-2012-2122-mysql未授权访问漏洞复现-vulhub

1.原理 参考&#xff1a;CVE-2012-2122 Mysql身份认证漏洞及利用-CSDN博客 简单来说&#xff0c;除了配置上的问题以外&#xff0c;是密码的验证出现了漏洞&#xff0c;导致尝试次数多了之后直接可以登入 使用&#xff1a;kalivulhub 2.复现 开一下镜像&#xff0c;用的是v…

Michael.W基于Foundry精读Openzeppelin第57期——ReentrancyGuard.sol

Michael.W基于Foundry精读Openzeppelin第57期——ReentrancyGuard.sol 0. 版本0.1 ReentrancyGuard.sol 1. 目标合约2. 代码精读2.1 constructor()2.2 modifier nonReentrant() 0. 版本 [openzeppelin]&#xff1a;v4.8.3&#xff0c;[forge-std]&#xff1a;v1.5.6 0.1 Reen…

docker-compose Install wiki

wiki 前言 最强大和可扩展的开源Wiki软件,使用Wiki.js漂亮而直观的界面,让编写文档成为一种乐趣 前提要求 安装 docker docker-compose 参考创建一键安装wiki wiki 安装目录/wikiwiki端口83admin 端口 84postgres 端口5432postgres 库 wikipostgres 用户 wikijspostgres 密…

【启明智显方案分享】ESP32-S3与GPT AI融合的智能问答嵌入式设备应用解决方案

一、引言 随着物联网&#xff08;IoT&#xff09;和人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;嵌入式设备正逐渐变得智能化。本解决方案是启明智显通过结合ESP32-S3的低功耗、高性能特性和GPT&#xff08;Generative Pre-trained Transformer&#xff09;…

简单了解java中线程的使用

线程 1、线程的相关概念 1.1、并行和并发 并行&#xff1a;在同一时刻&#xff0c;有多个任务在多个CPU上同时执行 并发&#xff1a;在同一时刻&#xff0c;有多个任务在单个CPU上交替执行 1.2、进程和线程 进程&#xff1a;就是在多任务管理系统中&#xff0c;每个独立执…

【MySQL】表的基本增删查改(结合案例)

文章目录 1.前言2.插入数据&#xff08;Create&#xff09;2.1案例2.2单行数据全列插入2.3多行数据指定列插入2.4插入否则更新2.5替换 3. 读取数据(Retireve)3.1案例3.2全列查询3.3指定列查询3.4查询字段为表达式3.5为查询结果起别名3.6去重3.7where条件3.7.1案例 3.8排序3.9筛…

Post Microsoft Build and AI Day 北京开发者日

Microsoft Build 开发者大会 Microsoft Build 开发者大会是微软每年一次的开发者技术盛会&#xff0c;旨在向全球开发者展示微软最新的技术、产品和服务。 刚刚过去的 2024 Microsoft Build 开发者大会围绕 Copilot、生成式 AI、应用程序安全、云平台、低代码等多个技术方向&a…

运维系列.在Docker中使用Grafana

运维专题 在Docker中使用Grafana - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://blog.csdn.net/qq_2855026…

Java对象的序列化与反序列化

序列化和反序列化是什么 当两个进程远程通信时&#xff0c;彼此可以发送各种类型的数据。无论是何种类型的数据&#xff0c;都会以二进制序列的形式在网络上传送。比如&#xff1a;我们可以通过http协议发生字符串信息&#xff1b;我们也可以在网络上直接发生Java对象。发送方…

【linux】信号(三)

本章节将会围绕信号处理进行展开讲解 目录 回顾一下&#xff1a;历史问题&#xff1a;内核态 VS 用户态地址空间&#xff1a;键盘的输出如何被检测到&#xff1a;OS如何正常运行&#xff1a;如何执行系统调用&#xff1a; 信号的处理&#xff1a;sigaction&#xff1a;信号的…

QML学习十九:ttf字体库使用

一、前言 在使用QML时&#xff0c;常常自定义按钮&#xff0c;按钮上有显示个图标&#xff0c;其实&#xff0c;那不是图标&#xff0c;是文本&#xff0c;如何显示&#xff1f; 本篇记录&#xff0c;如何导入阿里巴巴字体库&#xff0c;并调用显示。 二、阿里巴巴字体库下载…

分布式系统设计指南

目录 一、分布式简介 二、分布式系统核心概念 2.1 CAP 理论 2.2 BASE 原理 三、分布式系统设计 3.1 微服务拆分 3.2 通信模型 3.3 负载均衡 3.4 数据一致性 3.5 容错限流 3.6 扩展性 3.7 监控预警 3.8 自动化运维 一、分布式简介 分布式系统是由单体应用发展而来的&#xff…

统计绘图 | 既能统计分析又能可视化绘制的技能

在典型的探索性数据分析工作流程中&#xff0c;数据可视化和统计建模是两个不同的阶段&#xff0c;而我们也希望能够在最终的可视化结果中将相关统计指标呈现出来&#xff0c;如何让将两种有效结合&#xff0c;使得数据探索更加简单快捷呢&#xff1f;今天这篇推文就告诉你如何…

使用 Scapy 库编写 TCP 窗口大小探测攻击脚本

一、介绍 1.1 概述 TCP窗口大小探测攻击是一种信息收集攻击&#xff0c;攻击者通过向目标服务器发送特制的TCP数据包&#xff0c;探测目标服务器的TCP接收窗口大小&#xff08;TCP Window Size&#xff09;。了解目标服务器的TCP接收窗口大小&#xff0c;可以帮助攻击者优化后…

Spring Web MVC之过滤器Filter和拦截器HandlerInterceptor的区别和用法

作用时机不一样 Spring 框架有一个很重要的类DispatcherServlet。这个类继承了HttpServlet&#xff0c;HttpServlet实现了Servlet接口。相当于图片中的Servlet。所有和Spring框架相关配置&#xff0c;例如注解、xml配置、其他数据库连接配置、bean配置、拦截器配置等其他配置&…

深度学习研究生的职业前景:未来趋势与机遇

deep learning 深度学习研究生的职业前景&#xff1a;未来趋势与机遇一、深度学习的应用领域1. 计算机视觉2. 自然语言处理&#xff08;NLP&#xff09;3. 数据分析4. 游戏开发5. 健康医疗 二、职业机遇与挑战1. 工作机会2. 竞争与挑战3. 薪资前景 三、职业发展策略对于深度学习…

国外创意二维码应用:飞利浦旧物翻新活动,传播可持续性消费的重要性!

你知道去年有超过1000万件礼物被扔进了垃圾场吗? 这些被丢弃的物品中有许多仍在使用&#xff0c;飞利浦希望改变这种浪费现象。 去年的地球日&#xff0c;飞利浦策划了一场名为“Better than New” 的二维码营销活动。他们发布了一个视频&#xff0c;通过这个短视频将所有最终…

钉钉魔点指纹考勤机多少钱一台,指纹门禁考勤一体机价格

钉钉魔点指纹考勤机一台多少钱呢&#xff0c;指纹门禁考勤一体机的价格又是多少 钉钉魔点 X2 智能指纹考勤门禁一体机的参考价格是 359 元。 其具体参数情况如下&#xff1a; 产品类型&#xff1a;属于指纹考勤门禁一体机&#xff1b; 验证方式&#xff1a;为电容指纹&…