【Hot100】LeetCode—105. 从前序与中序遍历序列构造二叉树

目录

  • 1- 思路
    • 递归
  • 2- 实现
    • ⭐105. 从前序与中序遍历序列构造二叉树——题解思路
  • 3- ACM 实现


  • 原题连接:105. 从前序与中序遍历序列构造二叉树

1- 思路

递归

  • 前序:中左右
  • 中序:左中右

让前序的第一个元素作为中序的分割点
分割思路

  • 1- 递归参数与返回值(递归的指针是左闭右开的 也就是 [left,right) 的)
    • preOrder 前序数组;pLeft 中序数组左指针 用于切割;pRight:中序数组右指针 用于切割
    • inOrder前序数组;iLeft前序数组左指针 用于切割;iRight:前序数组右指针 用于切割
 TreeNode build(int[] preOrder,int pLeft,int pRight,int[] inOrder,int iLeft,int iRight)
  • 2- 终止条件
    • 两个 指针相遇时终止
  • 3- 树构造
  • 3.1 先找根:前序:中左右、中序:左中右,所以根节点一定是,前序数组的第一个元素
  • 3.2 去中序找 mid:用 iLeftiRight 去定位寻找,定位值为 mid
  • 3.3 中序数组拆分
    • iLfeft1 = iLfeft;
    • iRight1 = mid;
    • iLeft2 = mid+1;
    • iRight2 = iRight;
  • 3.4 前序数组拆分
    • pLeft1 = pLeft+1;
    • pRight1 = pLeft + (mid-iLeft1)+1;
    • pLeft2 = pRight1;
    • pRight2 = pRight;
  • 3.5 递归实现
    • 递归构造当前根节点的左子树和右子树
    • 左子树构造:root.left = build(preOrder,pLeft1,pRight1,inOrder,iLfeft1,iRight1);
    • 右子树构造:root.right = build(preOrder,pLeft2,pRight2,inOrder,iLfeft2,iRight2);

2- 实现

⭐105. 从前序与中序遍历序列构造二叉树——题解思路

在这里插入图片描述

/*** 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 TreeNode buildTree(int[] preorder, int[] inorder) {if(inorder.length==0){return null;}return build(preorder,0,preorder.length,inorder,0,inorder.length);}public TreeNode build(int[] preorder,int pLeft,int pRight,int[] inorder,int iLeft,int iRight){// 终止条件if(pLeft == pRight){return null;}// 找根int rootVal = preorder[pLeft];TreeNode root = new TreeNode(rootVal);// 定位midint mid = 0;for(mid=iLeft ; mid<iRight;mid++){if(inorder[mid]==rootVal){break;}}// 拆中序int iLeft1 = iLeft;int iRight1 = mid;int iLeft2 = mid+1;int iRight2 = iRight;// 拆前序int pLeft1 = pLeft+1;int pRight1 = pLeft+(mid-iLeft1)+1;int pLeft2 = pRight1;int pRight2 = pRight;// 构造root.left = build(preorder,pLeft1,pRight1,inorder,iLeft1,iRight1);root.right = build(preorder,pLeft2,pRight2,inorder,iLeft2,iRight2);return root;}
}

3- ACM 实现

public class buildTree {public static 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;}}public static TreeNode buildBy(int[] preOrder,int[] inOrder){// 调用递归buildreturn build(preOrder,0,preOrder.length,inOrder,0,inOrder.length);}// 递归实现public static TreeNode build(int[] preOrder,int pLeft,int pRight,int[] inOrder,int iLeft,int iRight){//1. 终止条件if(pLeft==pRight){return null;}// 2. 构造根节点int rootVal = preOrder[pLeft];TreeNode root = new TreeNode(rootVal);// 3.定位midint mid = 0;for(mid = iLeft;mid<iRight;mid++){if(inOrder[mid]==rootVal){break;}}// 拆分中序int iLeft1 = iLeft;int iRight1 = mid;int iLeft2 = mid+1;int iRight2 = iRight;// 拆分前序int pLeft1 = pLeft+1;int pRight1 = pLeft+(mid-iLeft1)+1;int pLeft2 = pRight1;int pRight2 = pRight;// 递归构造root.left = build(preOrder,pLeft1,pRight1,inOrder,iLeft1,iRight1);root.right = build(preOrder,pLeft2,pRight2,inOrder,iLeft2,iRight2);return root;}static List<List<Integer>> res = new ArrayList<>();public static List<List<Integer>> levelOrder(TreeNode root) {if(root==null){return res;}// 队列Queue<TreeNode> queue = new LinkedList<>();queue.offer(root);while(!queue.isEmpty()){int len = queue.size();List<Integer> path = new ArrayList<>();while(len>0){TreeNode nowNode = queue.poll();path.add(nowNode.val);if(nowNode.left!=null) queue.offer(nowNode.left);if(nowNode.right!=null) queue.offer(nowNode.right);len--;}res.add(new ArrayList<>(path));}return res;}public static void main(String[] args) {Scanner sc = new Scanner(System.in);String[] pOrder =  sc.nextLine().replace("[","").replace("]","").split(",");String[] iOrder = sc.nextLine().replace("[","").replace("]","").split(",");int[] pNum = new int[pOrder.length];int[] iNum = new int[iOrder.length];for(int i = 0 ; i < pOrder.length;i++){pNum[i] = Integer.parseInt(pOrder[i]);iNum[i] = Integer.parseInt(iOrder[i]);}TreeNode root = buildBy(pNum,iNum);levelOrder(root);System.out.println("结果是"+res.toString());}
}

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

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

相关文章

做个实验

做个实验 #include <bits/stdc.h> using namespace std; #define int long long #define ll __int128_t #define ar array<int, 2> #define arr array<int, 3> int n, m, k, inf 1LL << 61, mod 998244353;// 1e97; const int N 5e5 50;void sol…

使用gitee存储项目

gitee地址&#xff1a;Gitee - 基于 Git 的代码托管和研发协作平台 创建gitee远程仓库 将远程仓库内容拉取到本地仓库 复制下面这个地址 通过小乌龟便捷推送拉取代码&#xff1a;https://blog.csdn.net/m0_65520060/article/details/140091437

基于51单片机的百叶窗proteus仿真

地址&#xff1a;https://pan.baidu.com/s/19M6jeTIHJcyDBGNx4H9nTA 提取码&#xff1a;1234 仿真图&#xff1a; 芯片/模块的特点&#xff1a; AT89C52/AT89C51简介&#xff1a; AT89C52/AT89C51是一款经典的8位单片机&#xff0c;是意法半导体&#xff08;STMicroelectron…

RabbitMQ的核心概念

RabbitMQ是一个消息中间件&#xff0c;也是一个生产者消费者模型&#xff0c;负责接收&#xff0c;存储和转发消息。 核心概念 Producer 生产者&#xff0c;是RabbitMQ Server的客户端&#xff0c;向RabbitMQ发送消息。 Consumer 消费者&#xff0c;是RabbitMQ Server的客…

快手怎么免费的去掉视频水印?分享这三个工具给你

​ 我们经常会遇到想要保存的视频带有水印&#xff0c;这不仅影响美观&#xff0c;也不利于分享。为了解决这个问题&#xff0c;我将分享三个免费去除视频水印的工具&#xff0c;帮助你轻松去除水印&#xff0c;享受无干扰的视频体验。 工具一&#xff1a;奈斯水印助手(小程序…

初识MATLAB相关学习笔记

MATLAB的主要功能、应用场景及其相对于其他编程语言的优势和劣势 主要功能 1. 数值计算&#xff1a; 矩阵运算和线性代数。 解微分方程组。 优化算法。 数据插值和拟合。 2. 数据可视化&#xff1a; 2D和3D图形绘制。 图像处理和分析。 动画和GUI构建。 3. 算法开发&#x…

【Linux 从基础到进阶】GlusterFS分布式文件系统搭建

GlusterFS分布式文件系统搭建 引言 随着数据存储需求的快速增长,企业和开发者越来越需要一种高效、可扩展的存储解决方案。GlusterFS是一款开源的分布式文件系统,能够将多个存储服务器组合成一个统一的文件系统,提供高可用性、弹性扩展和性能优化等特性。它可以在标准的以…

数码管进阶设计验证

前言 随着数字电路和嵌入式系统的广泛应用&#xff0c;数码管作为一种常见的显示设备&#xff0c;在各种电子产品中扮演着重要角色。数码管以其结构简单、显示清晰和成本低廉的特点&#xff0c;广泛应用于计数器、时钟、测量仪器等领域。然而&#xff0c;传统的数码管设计通常仅…

DBeaver安装使用

文章目录 简介支持的数据库支持的系统 下载安装DBeaver使用修改Maven下载jar地址窗口->首选项连接->驱动->Maven配置仓库地址 选择需要连接的数据库进行连接 简介 DBeaver 是一个通用的数据库管理工具和 SQL 客户端&#xff0c;支持 MySQL, PostgreSQL, Oracle, DB2,…

运维学习————nginx2-配置详解及负载均衡

目录 一、配置文件详解 1.1、结构 1.2、重要配置解释 1.3、详细配置 全局配置 Events HTTP 服务器配置 server虚拟主机配置 location URL匹配配置 1.4、完整配置 二、负载均衡 2.1、概念 2.2、集群规划及实现 2.3、具体实现 2.3.1、克隆 2.3.2、修改tomcat1配…

Python | Leetcode Python题解之第372题超级次方

题目&#xff1a; 题解&#xff1a; class Solution:def superPow(self, a: int, b: List[int]) -> int:MOD 1337ans 1for e in b:ans pow(ans, 10, MOD) * pow(a, e, MOD) % MODreturn ans

C#高效异步文件监控与日志记录工具

优势 异步处理&#xff1a;提高了文件变化处理的效率&#xff0c;避免了阻塞主线程。线程安全&#xff1a;使用了线程安全的队列来避免多线程环境下的竞态条件。日志记录&#xff1a;异步日志记录减少了对主线程的干扰&#xff0c;并且能够处理大量事件。灵活配置&#xff1a;…

【MySQL、Hive】分区表

SQL 本身并不直接支持多线程处理&#xff0c;因为 SQL 是一种声明式语言&#xff0c;主要用于定义和操作数据库中的数据。多线程通常是在应用程序层面实现的。然而&#xff0c;有一些方法可以在 SQL 环境中优化并发处理和提高性能&#xff0c;这些方法在某种程度上可以被视为&q…

How to stream video in a loop via RTP using ffmpeg?

ffmpeg -re -fflags genpts -stream_loop -1 -i conf2-2.mp4 -vcodec copy -an -f rtp rtp://192.168.31.152:2000 vlc 应该可以播放出来的。 这里有一篇文章&#xff0c;有兴趣的可以试试&#xff1a; https://www.wowza.com/docs/how-to-configure-vlc-media-player-for…

MySQL 学习笔记之事务操作

文章目录 MySQL 事务操作事务概述1. 事务操作的基本用法1.1 创建表和插入数据1.2 设置手动提交1.3 正常的转账操作1.4 异常情况处理1.5 使用 START TRANSACTION 2. 事务隔离级别2.1 查看当前事务隔离级别2.2 设置事务隔离级别 完整代码 MySQL 事务操作 事务概述 事务是数据库管…

go+gin+vue入门

后端框架 1、安装go、goland 2、创建空项目 3、下载要用的包&#xff1a;命令行输入go get -u github.com/xxxx 4、安装mysql数据库&#xff0c;使用navicat创建数据库。 5、按照项目框架搭建目录、文件、代码&#xff1a;如router、model… 6、运行测试&#xff0c;go run ma…

云原生之全链路分布式跟踪系统 Zipkin和SkyWalking

贪多嚼不烂 Pinpoint 就不对比了 参考 APM系统简单对比(zipkin,pinpoint和skywalking) springcloud 看云 Zipkin和SkyWalking都是流行的分布式跟踪系统&#xff0c;但它们的设计和实现有明显的不同。 以下是它们之间的一些对比&#xff1a; 数据存储&#xff1a; Zipk…

RedisDistributedLock 分布式锁

设计一个简单的 RedisDistributedLock 类&#xff0c;实现单例模式&#xff0c;并包含基本的锁定机制。这个类将使用 Redis 来管理锁&#xff0c;确保在分布式系统中资源的同步访问 import redis.clients.jedis.Jedis;public class RedisDistributedLock {private static Redi…

nginxlvshaproxy负载均衡的区别

lvs 优势:抗负载能力很强、工作稳定、不占什么流量、pv 超过 1000 万可用 1s nginx:nginx工作第7层,支持 btkp 应用本身分流&#xff0c;s,没有这个功能 nginz 对网络依赖很小&#xff0c;nginx 安装简单也稳定,流量日p<1000 万 nginx 足以能撑住, 一般不是特别大的公司都达…

OpenCV(开源计算机视觉库)

OpenCV&#xff08;开源计算机视觉库&#xff09;是一个专注于实时计算机视觉的全面库&#xff0c;包含了丰富的工具和功能。以下是 OpenCV 中一些关键知识点的详细列表&#xff1a; 核心功能 基本结构&#xff1a;Mat、Scalar、Point、Size、Rect 等。 图像 I/O&#xff1a;读…