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

408 每日一题 Day 2:二叉树的重构与遍历

一、题目描述

已知一棵二叉树的前序遍历序列为ABDECFG,中序遍历序列为DBEAFCG,则该二叉树的后序遍历序列是?

  • A.DEBFGCA
  • B.DEBFCGA
  • C.DEBFGAC
  • D.DEBFAGC

二、考点分析

项目内容
核心知识点二叉树的遍历、根据遍历序列重构二叉树
难度⭐⭐⭐
408 真题出现频率⭐⭐⭐⭐⭐(必考题型)

三、前置知识回顾

3.1 二叉树的三种遍历方式

遍历方式顺序特点
前序遍历(根左右)根 → 左子树 → 右子树第一个节点是根
中序遍历(左根右)左子树 → 根 → 右子树根左边是左子树,右边是右子树
后序遍历(左右根)左子树 → 右子树 → 根最后一个节点是根

3.2 核心结论

给定前序 + 中序,可以唯一确定一棵二叉树。

  • 前序:确定根节点
  • 中序:确定左右子树的节点范围

3.3 判断方法速记

已知条件能确定什么
前序 + 中序✅ 唯一确定一棵二叉树
后序 + 中序✅ 唯一确定一棵二叉树
前序 + 后序❌ 不能唯一确定(除非是满二叉树)

四、解题思路

4.1 基本步骤

  1. 从前序遍历序列中取出第一个节点,它就是当前子树的根节点
  2. 在中序遍历序列中找到根节点的位置
  3. 中序中根节点左边的所有节点属于左子树,右边的所有节点属于右子树
  4. 根据左子树和右子树的节点个数,从前序中划分出左右子树的前序序列
  5. 递归处理左右子树

五、手动还原过程

5.1 已知序列

前序:A B D E C F G 中序:D B E A F C G

5.2 第一步:确定根节点

前序第一个节点是A,所以根节点是A

在中序中找到A的位置:

中序:D B E | A | F C G 左子树 右子树
  • 左子树节点:D, B, E(共 3 个)
  • 右子树节点:F, C, G(共 3 个)

5.3 第二步:处理左子树

左子树节点有 3 个:D, B, E

在前序中,根A后面的 3 个节点就是左子树的前序序列:

  • 左子树前序:B D E

左子树中序:D B E

对左子树递归:

  • 前序B D E的第一个节点是B,所以左子树的根是B
  • 在中序D B E中找到B
    • 左边:D→ 左子树的左子树
    • 右边:E→ 左子树的右子树

所以:

  • B的左孩子是D
  • B的右孩子是E

5.4 第三步:处理右子树

右子树节点有 3 个:F, C, G

在前序中,左子树用掉 3 个节点后,剩下的就是右子树的前序:

  • 右子树前序:C F G

右子树中序:F C G

对右子树递归:

  • 前序C F G的第一个节点是C,所以右子树的根是C
  • 在中序F C G中找到C
    • 左边:F→ 右子树的左子树
    • 右边:G→ 右子树的右子树

所以:

  • C的左孩子是F
  • C的右孩子是G

5.5 第四步:画出整棵树

A / \ B C / \ / \ D E F G

5.6 第五步:求后序遍历

后序遍历顺序:左子树 → 右子树 → 根

  • 左子树B的后序:D E B
  • 右子树C的后序:F G C
  • 整棵树的后序:D E B+F G C+A=D E B F G C A

验证选项DEBFGCA对应选项 A。

答案:A

六、代码实现

6.1 根据前序和中序重构二叉树

#include<iostream>#include<string>#include<unordered_map>usingnamespacestd;structTreeNode{charval;TreeNode*left;TreeNode*right;TreeNode(charx):val(x),left(nullptr),right(nullptr){}};classSolution{private:unordered_map<char,int>inorderIndex;// 记录中序中每个值的位置string preorder,inorder;TreeNode*build(intpreStart,intpreEnd,intinStart,intinEnd){if(preStart>preEnd)returnnullptr;charrootVal=preorder[preStart];TreeNode*root=newTreeNode(rootVal);introotIndex=inorderIndex[rootVal];// 根在中序中的位置intleftSize=rootIndex-inStart;// 左子树的节点个数// 递归构建左子树和右子树root->left=build(preStart+1,preStart+leftSize,inStart,rootIndex-1);root->right=build(preStart+leftSize+1,preEnd,rootIndex+1,inEnd);returnroot;}public:TreeNode*buildTree(string pre,string in){preorder=pre;inorder=in;for(inti=0;i<in.size();i++){inorderIndex[in[i]]=i;}returnbuild(0,pre.size()-1,0,in.size()-1);}};

6.2 后序遍历输出

voidpostorder(TreeNode*root){if(!root)return;postorder(root->left);postorder(root->right);cout<<root->val;}intmain(){string pre="ABDECFG";string in="DBEAFCG";Solution s;TreeNode*root=s.buildTree(pre,in);cout<<"后序遍历结果: ";postorder(root);// 输出: DEBFGCAcout<<endl;return0;}

6.3 复杂度分析

指标复杂度说明
时间复杂度O(n)每个节点访问一次
空间复杂度O(n)递归栈 + 哈希表

七、相关题目推荐

平台题号题目
LeetCode105从前序与中序遍历序列构造二叉树
LeetCode106从中序与后序遍历序列构造二叉树
LeetCode889从前序与后序遍历序列构造二叉树

八、总结

要点内容
前序作用确定根节点
中序作用确定左右子树的节点范围
递归核心先找根,再分左右,递归处理
后序结果DEBFGCA



http://www.jsqmd.com/news/861991/

相关文章:

  • 强制启动 Cursor IDE 主程序(不带 Agent 模式)
  • leetcode思路-236 二叉树的最近公共祖先
  • 最常见的漏洞有哪些?如何发现存在的漏洞呢
  • 分布式团队的代码协作规范:从分支策略到提交信息格式
  • 联想拯救者工具箱终极指南:释放游戏本性能的免费开源神器
  • 模块化机房建设解决方案
  • Cell Host Microbe | 西奈山伊坎医学院房刚团队揭示肠道微生物的表观遗传“押注对冲“策略
  • 同层排水45°和90°弯头,怎么使用才能避免堵塞、返水......
  • 用Claude Code做了一件事,现在AI比我还了解我?
  • 别再叠加加载了!一文讲透GB4053.2钢斜梯有限元分析,90%的人都搞错了!
  • 嘉立创EDA:原理图到PCB学习总结
  • Skillhub网站
  • 忙碌”幻觉:你以为在推进项目,其实只是在逃避
  • 全球石墨纤维粉市场分析与行业发展趋势
  • 对比直接使用厂商API与通过Taotoken调用的体验差异
  • 告别被封号!这款30项检测全过的“隐形浏览器”火了
  • 短波通讯:魔术6米波
  • 通宵降AI率?10款降AI工具亲测:哪个神器一次过,哪个白花钱
  • Redis——list相关指令
  • MCPMarket(MCP 市场)
  • 婚庆策划品牌选型全攻略:成都一站式婚庆策划公司电话/成都专业婚庆公司电话/成都专业婚庆策划公司电话/成都婚庆策划公司电话/选择指南 - 优质品牌商家
  • AI电商助手项目策划书(Demo版)
  • CVPR 2026 预讲会54位讲者云集| 6大方向+5个专场
  • 如何用AI做出可以赚钱的网站
  • AI犯了错没人追责,工程师犯了错丢饭碗?
  • 永久免费的国产模型
  • 2026广州酒楼回收选型推荐:广州附近上门回收空调/广州餐饮厨具饭店回收/广州餐饮设备回收/避坑与合规实操要点 - 优质品牌商家
  • 别再盲目上 Agent 了!大厂面试官最爱问的工程陷阱
  • 探索C/C++程序从源码到可执行文件的编译之旅
  • 今年的就业环境,离谱!!!