408 每日一题 Day 2:二叉树的重构与遍历
一、题目描述已知一棵二叉树的前序遍历序列为ABDECFG中序遍历序列为DBEAFCG则该二叉树的后序遍历序列是A.DEBFGCAB.DEBFCGAC.DEBFGACD.DEBFAGC二、考点分析项目内容核心知识点二叉树的遍历、根据遍历序列重构二叉树难度⭐⭐⭐408 真题出现频率⭐⭐⭐⭐⭐必考题型三、前置知识回顾3.1 二叉树的三种遍历方式遍历方式顺序特点前序遍历根左右根 → 左子树 → 右子树第一个节点是根中序遍历左根右左子树 → 根 → 右子树根左边是左子树右边是右子树后序遍历左右根左子树 → 右子树 → 根最后一个节点是根3.2 核心结论给定前序 中序可以唯一确定一棵二叉树。前序确定根节点中序确定左右子树的节点范围3.3 判断方法速记已知条件能确定什么前序 中序✅ 唯一确定一棵二叉树后序 中序✅ 唯一确定一棵二叉树前序 后序❌ 不能唯一确定除非是满二叉树四、解题思路4.1 基本步骤从前序遍历序列中取出第一个节点它就是当前子树的根节点在中序遍历序列中找到根节点的位置中序中根节点左边的所有节点属于左子树右边的所有节点属于右子树根据左子树和右子树的节点个数从前序中划分出左右子树的前序序列递归处理左右子树五、手动还原过程5.1 已知序列前序A B D E C F G 中序D B E A F C G5.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的左孩子是DB的右孩子是E5.4 第三步处理右子树右子树节点有 3 个F, C, G在前序中左子树用掉 3 个节点后剩下的就是右子树的前序右子树前序C F G右子树中序F C G对右子树递归前序C F G的第一个节点是C所以右子树的根是C在中序F C G中找到C左边F→ 右子树的左子树右边G→ 右子树的右子树所以C的左孩子是FC的右孩子是G5.5 第四步画出整棵树A / \ B C / \ / \ D E F G5.6 第五步求后序遍历后序遍历顺序左子树 → 右子树 → 根左子树B的后序D E B右子树C的后序F G C整棵树的后序D E BF G CAD E B F G C A验证选项DEBFGCA对应选项 A。答案A六、代码实现6.1 根据前序和中序重构二叉树#includeiostream#includestring#includeunordered_mapusingnamespacestd;structTreeNode{charval;TreeNode*left;TreeNode*right;TreeNode(charx):val(x),left(nullptr),right(nullptr){}};classSolution{private:unordered_mapchar,intinorderIndex;// 记录中序中每个值的位置string preorder,inorder;TreeNode*build(intpreStart,intpreEnd,intinStart,intinEnd){if(preStartpreEnd)returnnullptr;charrootValpreorder[preStart];TreeNode*rootnewTreeNode(rootVal);introotIndexinorderIndex[rootVal];// 根在中序中的位置intleftSizerootIndex-inStart;// 左子树的节点个数// 递归构建左子树和右子树root-leftbuild(preStart1,preStartleftSize,inStart,rootIndex-1);root-rightbuild(preStartleftSize1,preEnd,rootIndex1,inEnd);returnroot;}public:TreeNode*buildTree(string pre,string in){preorderpre;inorderin;for(inti0;iin.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);coutroot-val;}intmain(){string preABDECFG;string inDBEAFCG;Solution s;TreeNode*roots.buildTree(pre,in);cout后序遍历结果: ;postorder(root);// 输出: DEBFGCAcoutendl;return0;}6.3 复杂度分析指标复杂度说明时间复杂度O(n)每个节点访问一次空间复杂度O(n)递归栈 哈希表七、相关题目推荐平台题号题目LeetCode105从前序与中序遍历序列构造二叉树LeetCode106从中序与后序遍历序列构造二叉树LeetCode889从前序与后序遍历序列构造二叉树八、总结要点内容前序作用确定根节点中序作用确定左右子树的节点范围递归核心先找根再分左右递归处理后序结果DEBFGCA
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2633503.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!