当前位置: 首页 > news >正文

每日一练:从前序遍历与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)

题目要求:

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。

示例 1:

输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:

输入: preorder = [-1], inorder = [-1]
输出: [-1]

提示:

  • 1 <= preorder.length <= 3000
  • inorder.length == preorder.length
  • -3000 <= preorder[i], inorder[i] <= 3000
  • preorder 和 inorder 均 无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

解法-1 递归 O(N^2)

        题目说preorder序列(简称p)是前序遍历,inorder(简称i)是中序遍历,那么先从 p 中找到第一个元素,然后找到这个元素在 i 中的位置。

        在i中以这个位置为界限,根据中序遍历左根右的顺序,这个位置左边的数组构成它的左子树,右边构成它的右子树。

        然后在p中找第二个元素,根据前序遍历根左右的顺序,这个元素一定是左子树的根,然后继续在i中找到它,它的左(不低于0,小于上个根)右(不大于结尾,大于上个根)边,也是它的左右子树。

        重复上述过程,直到数组只剩一个节点,它就是某个根的子树,至此就可以从简单到复杂构建子树了。

class Solution {TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder, int start,int end,int left) {if (start == end)return new TreeNode(inorder[start]);for (int i = left; i < preorder.size(); i++) {for (int j = start; j <= end; j++)if (preorder[i] == inorder[j]) {TreeNode*leftTree = _buildTree(preorder,inorder,start,j-1,left+1);TreeNode*rightTree = _buildTree(preorder,inorder,j+1,end,left+1);TreeNode* root = new TreeNode(inorder[j],leftTree,rightTree);return root;}}return nullptr;}public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {return _buildTree(preorder,inorder,0,inorder.size()-1,0);}
};

相关文章:

  • 这是一个悲惨的故事
  • (十七)、Mac 安装k8s
  • Miniforge详细安装教程(macOs和Windows)
  • mongoDB快速上手
  • vue按钮接收键盘回车事件
  • 云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索
  • 卸载apt-get 安装的PostgreSQL版本
  • HTML5+JavaScript绘制闪烁的网格错觉
  • 基于php的酒店管理系
  • 【Python】数据可视化之点线图
  • 后端人需知
  • Spring Boot 进阶- Spring Boot 自定义拦截器详解
  • Go版数据结构 -【4.2 二叉搜索树】
  • 从零开始Ubuntu24.04上Docker构建自动化部署(五)Docker安装jenkins
  • Linux系统性能调优技巧:提升效率与响应速度的秘诀
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【node学习】协程
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • es的写入过程
  • HTTP 简介
  • HTTP请求重发
  • Java教程_软件开发基础
  • React的组件模式
  • Sequelize 中文文档 v4 - Getting started - 入门
  • ubuntu 下nginx安装 并支持https协议
  • vue学习系列(二)vue-cli
  • windows下使用nginx调试简介
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 数组大概知多少
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • No resource identifier found for attribute,RxJava之zip操作符
  • 关于Android全面屏虚拟导航栏的适配总结
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • # SpringBoot 如何让指定的Bean先加载
  • # 利刃出鞘_Tomcat 核心原理解析(七)
  • #define与typedef区别
  • #NOIP 2014#day.2 T1 无限网络发射器选址
  • (32位汇编 五)mov/add/sub/and/or/xor/not
  • (4)事件处理——(7)简单事件(Simple events)
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (MATLAB)第五章-矩阵运算
  • (二)十分简易快速 自己训练样本 opencv级联lbp分类器 车牌识别
  • (分布式缓存)Redis持久化
  • (附源码)ssm失物招领系统 毕业设计 182317
  • (离散数学)逻辑连接词
  • (十)c52学习之旅-定时器实验
  • (一)、软硬件全开源智能手表,与手机互联,标配多表盘,功能丰富(ZSWatch-Zephyr)
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • .L0CK3D来袭:如何保护您的数据免受致命攻击
  • .NET/C# 的字符串暂存池
  • .Net接口调试与案例
  • .net连接MySQL的方法
  • .NET设计模式(7):创建型模式专题总结(Creational Pattern)
  • @DataRedisTest测试redis从未如此丝滑