当前位置: 首页 > 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.zskr.cn/news/1342605.html

相关文章:

  • leetcode思路-236 二叉树的最近公共祖先
  • 分布式团队的代码协作规范:从分支策略到提交信息格式
  • Cell Host Microbe | 西奈山伊坎医学院房刚团队揭示肠道微生物的表观遗传“押注对冲“策略
  • 远程技术面试的潜规则:摄像头角度可能影响你的录用
  • VisionPro 中 验证工具 ID Verfiction
  • 用Claude Code做了一件事,现在AI比我还了解我?
  • 对比直接使用厂商API与通过Taotoken调用的体验差异
  • 告别被封号!这款30项检测全过的“隐形浏览器”火了
  • 通宵降AI率?10款降AI工具亲测:哪个神器一次过,哪个白花钱
  • Spec-Kit + Superpowers 实战:Go语言博客论坛系统的规范驱动开发
  • 微波遥感杂谈五(微波辐射计)
  • 适配多层级组织管理,科学运用 360 度反馈打造公平高效绩效文化
  • CVPR 2026 预讲会54位讲者云集| 6大方向+5个专场
  • 鸿蒙备考题库页面构建:错题本、小组榜单与备考提示模块详解
  • 永久免费的国产模型
  • 从 35,000 行 WhatsApp 对话到一个会说话的 AI 销售员——OpenClaw 多层记忆架构实战
  • 2026年5月天津五粮液回收机构权威度实测评测 - 优质品牌商家
  • 逆向苹果私有框架!他把第三方视频逼成了macOS原生壁纸
  • 郯城本地苗木供应商评测:山东,临沂,江苏,乌桕苗木、巨紫荆苗木、日本红枫苗木、朴树苗木、榉树苗木、樱花苗木、欧洲枫香苗木选择指南 - 优质品牌商家
  • 2026年四川颗粒板厂家评测:靠谱供应商核心维度解析 - 优质品牌商家
  • 学生用户画像-考勤主题标签构建
  • C++强制类型转换的四种方式
  • 重磅!AI 大神 Karpathy 加盟 + 算力工具链垄断,Anthropic 凭啥围剿 OpenAI?
  • 变压器设计-基于AP法
  • 论文开讲,开会内容
  • CAN模型:让GAN具备审美判断与风格突破能力
  • 智慧铁路之钢轨缺陷识别 自动化轨道检测系统开发 铁路养护车辆计算机视觉功能实现 轨道交通腐蚀识别 钢轨磨损识别10340期
  • 台湾话TTS自然度卡在3.2/5?用MOS-LQO双维度测评法定位8类发音失真源(附自动化诊断脚本)
  • 【助睿实验指导】助睿ETL-订单利润分流数据加工
  • 神经网络工程化:从信号处理视角解剖CNN/RNN/Transformer设计逻辑