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

LeetCode105. 从前序与中序遍历序列构造二叉树

105. 从前序与中序遍历序列构造二叉树

文章目录

      • [105. 从前序与中序遍历序列构造二叉树](https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/)
        • 一、题目
        • 二、题解


一、题目

给定两个整数数组 preorderinorder ,其中 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
  • preorderinorder无重复 元素
  • inorder 均出现在 preorder
  • preorder 保证 为二叉树的前序遍历序列
  • inorder 保证 为二叉树的中序遍历序列

二、题解

算法思路

我们要根据给定的前序遍历和中序遍历序列构建出一棵二叉树。前序遍历序列告诉我们根节点的值以及左子树和右子树的分割点,中序遍历序列告诉我们左子树和右子树的节点排列顺序。我们可以通过递归的方法来实现构建二叉树的过程。

具体步骤如下:

  1. 从前序遍历序列中取出第一个元素,它是当前子树的根节点的值。
  2. 在中序遍历序列中找到该根节点的值,根据这个值,将中序序列划分为左子树部分和右子树部分。
  3. 根据左子树和右子树的节点数量,在前序遍历序列中划分出左子树的前序序列和右子树的前序序列。
  4. 递归地构建左子树和右子树。

具体实现

class Solution {
public:TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {// 基准情况:如果前序遍历序列为空,返回空指针表示空树if (preorder.size() == 0) {return nullptr;}// 创建当前子树的根节点TreeNode *root = new TreeNode();root->val = preorder[0];// 在中序遍历序列中找到根节点的位置int index = 0;for (index = 0; index < inorder.size(); index++) {if (inorder[index] == preorder[0]) {break;}}// 划分左子树和右子树的序列vector<int> leftPreorder(preorder.begin() + 1, preorder.begin() + index + 1);vector<int> leftInorder(inorder.begin(), inorder.begin() + index);vector<int> rightPreorder(preorder.begin() + index + 1, preorder.end());vector<int> rightInorder(inorder.begin() + index + 1, inorder.end());// 递归构建左子树和右子树root->left = buildTree(leftPreorder, leftInorder);root->right = buildTree(rightPreorder, rightInorder);return root;}
};

算法分析

  • 时间复杂度:在每次递归中,我们都需要遍历中序遍历序列来找到根节点的位置,这需要 O(n) 的时间,其中 n 是节点数量。递归的总时间复杂度取决于递归的层数以及每层的操作,因此总体时间复杂度为 O(n)。

  • 空间复杂度:每次递归都会创建新的前序和中序序列,空间复杂度主要取决于递归的深度,最坏情况下递归深度为 n,所以空间复杂度为 O(n)。此外,还需要存储二叉树节点的空间,所以总体空间复杂度也为 O(n)。

http://www.lryc.cn/news/114277.html

相关文章:

  • 编码技巧——Sentinel的blockHandler与fallback
  • 最新成果展示:GaN基Micro-LED热学模型数据库的开发及应用
  • 【Vue3】动态组件
  • Java超级玛丽小游戏制作过程讲解 第五天 创建并完成常量类04
  • 设置浏览器兼容
  • Java # List
  • git原理与使用
  • 【C语言题解】将一句话的单词进行倒置,标点不倒置。
  • Postman 的简单使用
  • 在CentOS7安装部署GitLab服务
  • 订单系统就该这么设计,稳的一批~
  • Agents改变游戏规则,亚马逊云科技生成式AI让基础模型加速工作流
  • 详细教程:如何搭建废品回收小程序
  • 什么是双亲委派机制?
  • Mageia 9 RC1 正式发布,Mandriva Linux 发行版的社区分支
  • ChatGPT: 人机交互的未来
  • Linux 常用操作命令
  • 24届近5年重庆邮电大学自动化考研院校分析
  • 如何对oracle和mysql进行 分区分表
  • Windows下安装Sqoop
  • Chrome 谷歌浏览器,自动填充密码,提示需要输入电脑开机密码问题
  • Java技术整理(3)—— 多线程并发篇
  • 2023热门跨境电商平台哪个入驻条件适合新手?
  • 【MFC】05.MFC第一大机制:程序启动机制-笔记
  • 小程序动画 animation 的常规使用
  • Swift 周报 第三十四期
  • [虚幻引擎] UE DTBase64 插件说明 使用蓝图对字符串或文件进行Base64加密解密
  • Jmeter组件作用域及执行顺序
  • 题目:2309.兼具大小写的最好英文字母
  • RISC-V公测平台发布:如何在SG2042上玩转OpenMPI