news 2026/7/14 13:43:24

[特殊字符]【LeetCode 106】从中序与后序遍历构造二叉树(C语言详解|递归+区间划分)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
[特殊字符]【LeetCode 106】从中序与后序遍历构造二叉树(C语言详解|递归+区间划分)

📌 一、题目描述

给定两个数组:

  • inorder:中序遍历(左 → 根 → 右)

  • postorder:后序遍历(左 → 右 → 根)

要求:构造并返回这棵二叉树


🔹 示例

输入: inorder = [9,3,15,20,7] postorder = [9,15,7,20,3] 输出: 3 / \ 9 20 / \ 15 7

🔍 二、核心思路

这题本质就是:

利用遍历特性还原树结构


⭐ 关键观察

1️⃣ 后序遍历 → 找根节点
后序:左 → 右 → 根

👉最后一个元素一定是根节点

root = postorder[postR];

2️⃣ 中序遍历 → 分割左右子树
中序:左 → 根 → 右

找到 root 在 inorder 中的位置k

[inL ...... k-1] k [k+1 ...... inR] 左子树 根 右子树

3️⃣ 如何切分 postorder?(核心难点)

设:

leftSize = k - inL

那么:

子树inorder 区间postorder 区间
左子树[inL, k-1][postL, postL + leftSize - 1]
右子树[k+1, inR][postL + leftSize, postR - 1]

✍️ 三、递归解法(C语言实现)

✅ 完整代码

#include <stdlib.h> // 二叉树结构定义 struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; }; // 查找 root 在 inorder 中的位置 int findIndex(int* inorder, int inL, int inR, int val) { for (int i = inL; i <= inR; i++) { if (inorder[i] == val) return i; } return -1; } // 构建函数 struct TreeNode* build( int* inorder, int inL, int inR, int* postorder, int postL, int postR ) { // 终止条件 if (inL > inR) return NULL; // 1️⃣ 根节点 int rootVal = postorder[postR]; struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode)); root->val = rootVal; root->left = root->right = NULL; // 2️⃣ 在 inorder 找位置 int k = findIndex(inorder, inL, inR, rootVal); // 3️⃣ 左子树大小 int leftSize = k - inL; // 4️⃣ 递归构建 root->left = build(inorder, inL, k - 1, postorder, postL, postL + leftSize - 1); root->right = build(inorder, k + 1, inR, postorder, postL + leftSize, postR - 1); return root; } // 主函数 struct TreeNode* buildTree(int* inorder, int inorderSize, int* postorder, int postorderSize) { return build(inorder, 0, inorderSize - 1, postorder, 0, postorderSize - 1); }

📊 四、复杂度分析

❌ 当前实现

  • 查找 root:O(n)

  • 总体复杂度:

O(n^2)

🚀 优化(推荐面试说)

使用哈希表记录 inorder 下标:

value -> index

👉 查找变 O(1)

✅ 优化后复杂度

时间复杂度:O(n) 空间复杂度:O(n)

⚠️ 五、常见错误总结

❌ 错误 1:把 postorder[0] 当根

👉 根在最后一个!


❌ 错误 2:区间乱写

👉 强烈建议统一:

全部使用:左闭右闭 [L, R]

❌ 错误 3:右子树没减 1

postR - 1 // 很多人忘

❌ 错误 4:leftSize 写错

leftSize = k - inL; // 必须这样

🧩 六、和 105 题的关系(面试重点)

题目根节点位置
前序 + 中序preorder[preL]
中序 + 后序postorder[postR]

🎯 一句话模板

前序定头,后序定尾;中序划分左右子树


🚀 七、总结

这类题的本质只有三步:

  1. 确定根节点(前序头 / 后序尾)

  2. 在中序中定位根

  3. 按长度切分左右子树


如果你准备面试,这题建议做到:

  • ✅ 能手写递归版本

  • ✅ 能口述区间划分

  • ✅ 能说出 O(n) 优化

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 13:43:23

从靶场到实战:手把手教你用xss-labs复现10种Web安全漏洞(附完整Payload)

从靶场到实战&#xff1a;XSS-Labs十层关卡深度解析与实战绕过技巧 1. 理解XSS-Labs的训练价值 XSS-Labs作为经典的跨站脚本攻击训练平台&#xff0c;通过十个精心设计的关卡模拟了真实Web应用中常见的XSS防护机制。与单纯的理论学习不同&#xff0c;这个靶场最大的价值在于&am…

作者头像 李华
网站建设 2026/7/14 13:43:25

避开这5个坑!Unity EditorGUILayout开发中的常见问题解决方案

Unity EditorGUILayout开发实战&#xff1a;5个典型问题与深度解决方案 在Unity编辑器扩展开发中&#xff0c;EditorGUILayout是构建自定义Inspector界面的核心工具集。许多中高级开发者在实际项目中常会遇到一些看似简单却令人头疼的问题。本文将基于真实项目经验&#xff0c;…

作者头像 李华
网站建设 2026/7/14 13:43:41

企业级NAS如何为vSphere提供高性能共享存储?ISCSI优化配置与容量监控技巧

企业级NAS与vSphere深度整合&#xff1a;ISCSI性能调优与智能监控实战 在虚拟化架构中&#xff0c;存储性能往往成为制约整体系统效率的关键瓶颈。根据实际运维数据显示&#xff0c;超过60%的vSphere性能问题可追溯至存储子系统配置不当。本文将深入剖析如何通过ISCSI协议实现企…

作者头像 李华
网站建设 2026/7/14 13:43:42

PageHelper分页查询

这是一个由Mybatis提供的插件&#xff0c;在使用前先引入依赖。一、依赖<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.7</version></dependency&…

作者头像 李华
网站建设 2026/7/14 13:43:40

从Swan语言到Scade 6:一份给嵌入式开发者的官方文档学习路线图

从Swan语言到Scade 6&#xff1a;嵌入式开发者的高效学习路径 当你在Swan语言的官方教程中频繁遇到"假设读者已掌握Scade 6基础"的提示时&#xff0c;是否感到一丝迷茫&#xff1f;作为嵌入式开发领域的从业者&#xff0c;我完全理解这种技术栈切换带来的困惑。本文将…

作者头像 李华