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

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

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

这道题的核心思路是利用先序遍历中序遍历的特性递归构造二叉树:
1、先序遍历根->左->右->(第一个元素一定是根节点)
2、中序遍历左->根->右(根节点左侧是左子树,右侧是右子树)

代码核心解析:

1、哈希表优化

用HashMap存储中序遍历的值-索引映射,将查找根节点在中序数组中的位置的时间复杂度从O(n)降为O(1),整体时间复杂度优化为O(n)。

哈希表定义语法:
Map<Integer,Integer> inorderMap = new HashMap<>();
将中序数组存入哈希表的,用inorderMap.put(inorder[i],i),将值-索引存入哈希表

2、递归逻辑

  • 终止条件数组索引越界(preStart > preEnd || inStart > inEnd),说明没有节点需要构造,返回Null。
  • 确定根节点:先序数组的第一个元素就是当前子树的根节点(根据先序遍历的特性根左右
  • 分割左右子树
    中序数组中,根节点左侧 = 左子树,右侧 = 右子树(左根右)
    先序数组中,根节点后leftSize个元素 = 左子树,剩余元素 = 右子树
  • 递归构造:分别递归构造左、右子树,挂载到根节点上

3、索引边界

  • 左子树先序:[preStart+1, preStart+leftSize]
  • 右子树先序:[preStart+leftSize+1, preEnd]
  • 左子树中序:[inStart, rootIndex-1]
  • 右子树中序:[rootIndex+1, inEnd]

复杂度分析:

  • 时间复杂度:O(n),n 是节点个数,仅遍历一次数组构建哈希表,递归每个节点仅访问一次
  • 空间复杂度:O(n),哈希表存储 n 个节点,递归调用栈最坏(链状二叉树)为 O(n)

完整代码实现如下:

import java.util.HashMap;
import java.util.Map;

// 二叉树节点定义
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 class ConstructBinaryTree {
// 哈希表:存储中序遍历的值 -> 索引,快速定位根节点位置
private Map<Integer, Integer> inorderMap;

public TreeNode buildTree(int[] preorder, int[] inorder) {inorderMap = new HashMap<>();// 将中序数组存入哈希表,方便快速查找for (int i = 0; i < inorder.length; i++) {inorderMap.put(inorder[i], i);}// 递归构造二叉树return build(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
}/*** 递归构造二叉树* @param pre 先序数组* @param preStart 先序数组起始索引* @param preEnd 先序数组结束索引* @param in 中序数组* @param inStart 中序数组起始索引* @param inEnd 中序数组结束索引* @return 构造的子树根节点*/
private TreeNode build(int[] pre, int preStart, int preEnd, int[] in, int inStart, int inEnd) {// 递归终止条件:索引越界,说明没有节点if (preStart > preEnd || inStart > inEnd) {return null;}// 1. 先序第一个节点就是当前子树的根节点int rootVal = pre[preStart];TreeNode root = new TreeNode(rootVal);// 2. 在中序数组中找到根节点的索引int rootIndex = inorderMap.get(rootVal);// 3. 计算左子树的节点个数int leftSize = rootIndex - inStart;// 4. 递归构造左子树// 先序:根节点后 leftSize 个元素是左子树// 中序:根节点左侧所有元素是左子树root.left = build(pre, preStart + 1, preStart + leftSize, in, inStart, rootIndex - 1);// 5. 递归构造右子树// 先序:左子树之后的元素是右子树// 中序:根节点右侧所有元素是右子树root.right = build(pre, preStart + leftSize + 1, preEnd, in, rootIndex + 1, inEnd);return root;
}// 测试代码
public static void main(String[] args) {ConstructBinaryTree solution = new ConstructBinaryTree();// 示例:先序遍历 [3,9,20,15,7],中序遍历 [9,3,15,20,7]int[] preorder = {3,9,20,15,7};int[] inorder = {9,3,15,20,7};TreeNode root = solution.buildTree(preorder, inorder);System.out.println("二叉树构造完成,根节点值:" + root.val);
}

}

用 preorder = [3,9,20,15,7],inorder = [9,3,15,20,7],逐层级拆解递归过程,每一步都标注索引边界和节点构造逻辑。

初始调用
build(pre,0,4,in,0,4)

  • 根节点值pre[0] = 3,在中序中 rootIndex = 1
  • 左子树节点数 leftSize = 1 - 0 = 1
  • 构造根节点3

1.递归构造左子树
调用:build(pre,0+1,0+1,in,0,1-1)→ build(pre, 1, 1, in, 0, 0)

  • 根节点值pre[1] = 9,在中序中rootIndex = 0
  • 左子树节点数left = 0-0 = 0
  • 构造节点9
    左子树调用:build(pre, 2, 1, in, 0, -1) → 索引越界,返回 null → 节点 9 的左孩子为 null
    右子树调用:build(pre, 1+0+1, 1, in, 0+1, 0) → build(pre, 2, 1, in, 1, 0) → 索引越界,返回 null → 节点 9 的右孩子为 null
  • 节点9挂载到根节点3的左孩子位置

2.递归构造右子树
调用:调用:build(pre, 0+1+1, 4, in, 1+1, 4) → build(pre, 2, 4, in, 2, 4)

递归过程核心规律

每一层递归只做 3 件事

  1. pre[preStart] 作为当前根节点
  2. rootIndex 计算 leftSize分割当前节点左右子树的索引范围
  3. 递归处理左右子树,挂载到当前根节点(每层递归返回root)
http://www.jsqmd.com/news/687821/

相关文章:

  • 常州永九安吊装搬运:常州起重吊装口碑好的公司 - LYL仔仔
  • 命令行与PowerShell利器:使用DISM和CleanMgr进行高级清理
  • 百搜科技:全链路GEO推广服务,数据驱动SaaS软件智能获客 - 品牌2025
  • 2026基础设施健康诊断低空平台推荐,冰柏科技如何用空间智能提前预警 - 品牌2026
  • 从闲置到现金:百联OK卡回收变现平台的高效流程揭秘 - 团团收购物卡回收
  • 实测优推宝:深耕GEO领域,以源头实力破解企业推广难题—全方位测评解析 - 速递信息
  • 2026工程进度管理低空平台推荐,冰柏科技用实力说话 - 品牌2026
  • 9款最佳AI表格工具深度评测:让数据处理效率翻倍的智能助手
  • 5步突破:Cursor Free VIP完全指南,免费解锁AI编程助手高级功能
  • 荆州 AI 培训机构:炽培星赋能本土企业与个人,解锁 AIGC 商业新可能 - 速递信息
  • 别再手动拖图片了!用Excel Power Query一键导入文件夹所有图片并自动命名(附排序技巧)
  • 期末不内卷!课程论文高效破局:虎贲等考 AI 一键成型,真文献 + 强实证稳拿高分
  • 别再猜了!MOD13A1计算植被覆盖度时,NDVI负值和置信度到底怎么选?我的对比实验来了
  • ChanlunX缠论插件:3分钟掌握专业级股市结构分析的终极指南
  • 2026年小型/实验室双锥干燥机源头厂家,先竹干燥自产自销支持定制 - 品牌推荐大师1
  • 闲置山东一卡通如何处理?回收变现的快速指南 - 团团收购物卡回收
  • 英法德出海指南:ChatGPT 与 Gemini 时代的 GEO 优化服务公司首选 - 资讯焦点
  • 兰州民办初中排行:5所合规校核心维度实测对比 - 资讯焦点
  • 天猫超市卡回收攻略 - 团团收购物卡回收
  • TensorBoardX终极指南:10个技巧让深度学习可视化更简单高效
  • 百联OK卡回收变现指南:如何最大化你的卡片价值 - 团团收购物卡回收
  • 10个wrapt实用技巧:从基础装饰器到高级包装模式
  • 本周更新|完善 AI 员工对上传文档的解析能力
  • 【研报332】美国EV/ESS电池产业研究报告:电动车触底与储能上行,市场情绪将转向
  • Axure高保真OA系统原型实战:从零搭建企业级协同办公后台(含30+模块源文件)
  • Home Assistant Midea Air Appliances (LAN):摆脱云端依赖,实现美的智能家电本地网络控制
  • 3-17 WSP JSA颜色知多少(颜色专题精讲)学习笔记
  • 商标交易平台综合实力TOP榜出炉:热门行业分榜公布,看看你的行业排第几? - 资讯焦点
  • 2026年毕节国防班升学与中考投档线学生的最优选择 - 优质企业观察收录
  • 告别 AI 绘图乱象:虎贲等考 AI 科研绘图,让期刊配图精准合规又高效