leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
admin
2023-08-16 21:58:58
0次

题目链接
题目描述:
【leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树】根据一棵树的中序遍历与后序遍历构造二叉树。
声明
??本题与#105几乎一致(题解在此~),可以学会105然后自己敲一遍106以巩固提升。
??与105两点区别:

  1. 根结点遍历要从后序遍历数组最后一位开始,这是由后序遍历的顺序而定的。
  2. 根右左建树,因为是后序遍历数组确定根结点值且后序遍历数组倒序就是根右左,所以要先右后左。
??其实,练习过105和106,可能更加理解为什么前序+中序or后序+中序会唯一确定二叉树,而前序+后序不能!简而言之,前/后序的功能为提供根结点值,而中序的功能为根据根结点值确定根结点索引以分治思想去递归建树。
解题思路
??还是给一例子吧~
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
??如果这是一道选择填空甚至应用题,我们会怎么做?
  1. 由后序遍历特点可知,根结点root是"吊车尾",也就是3。
  2. 根据root值找到中序遍历数组中的相应索引,这时由中序遍历特点可知,左子树位于根结点索引左侧,也就是9;右子树位于根结点索引右侧15,20,7。
  3. 对左、右子树数组重复1、2步骤,直到数组为空
??这就是我们日常做题的步骤,不难发现,其中蕴含着分治和递归的思想。简而言之,就是利用后序遍历得到根结点值去划分中序遍历左右子树,而后按根、右、左顺序递归建立二叉树。下面说两点细节:
  1. 对于划分左右子树区间以及递归结束条件的确定,参考二分查找的查找区间细节。注意本文的左右指针设置为l = 0, r = length,即[l...r)左闭右开区间。
  2. 如何确定后序遍历中根结点位置?(为什么自减就确定是下一个根结点?)一定要结合后序遍历本身特点(根结点是"吊车尾"),以及我们构建二叉树的顺序(根、右、左)。这就涉及到递归的流程(考虑栈的特点),一定是等右子树建完再去建左子树。
??我们一定要明确一点,那就是所谓的先右后左建树,是根据后序遍历数组的特点而定的,就像#105中,先左后右的建树顺序是由先序遍历数组的特点而决定的。
代码
class Solution { public: TreeNode* build(vector& inorder, vector& postorder, int l, int r, int& pos_Index){ if(l == r) return NULL; //通过后序遍历的根结点值获取其在中序遍历的索引 int index_Val = postorder[pos_Index]; int index = record.find(index_Val)->second; TreeNode* root = new TreeNode(index_Val); //建立根结点 pos_Index--; //寻找下一个根结点 //根右左建树,因为后序遍历顺序左右根,反映到后序遍历数组上的倒序为根右左 if(pos_Index >= 0){ root->right = build(inorder, postorder, index + 1, r, pos_Index); root->left = build(inorder, postorder, l, index, pos_Index); }return root; }TreeNode* buildTree(vector& inorder, vector& postorder) { if(inorder.size() == 0) return NULL; int n = inorder.size(); //记录 for(int i = 0; i < n; i++) record.insert(make_pair(inorder[i], i)); //(元素,索引))//根据后序遍历特点(左右根)得到根结点索引 int pos_Index = n - 1; return build(inorder, postorder, 0, n, pos_Index); }private: unordered_map record; };


如果有错误或者不严谨的地方,请务必给予指正,十分感谢。
本人blog:http://breadhunter.gitee.io

相关内容

热门资讯

大浪淘金APP黑幕揭秘:内盘操...   大浪淘金APP平台最隐蔽的黑幕,在于其完全封闭的内盘交易系统。这个看似与国际市场接轨的交易平台,...
告别固定工资实现财富自由?一品...   普通投资者被广告宣传诱导,注册就送现金,充值返现金券等等这些宣传方式,都是在引流到平台开户,不怕...
哈易购APP打着现货交易幌子搞...   网络上各类白银、铂金等贵金属投资广告铺天盖地,不少平台以"现货交易"为名,暗中却从事着非法期货交...
5元起投!高额收益?中国白银、...   上海华通白银国际交易中心有限公司(以下简称“华通白银国际”)打着“白银、铂金现货订购”的旗号,实...
"九州订购APP、起...   近年来,贵金属投资热度持续攀升,但乱象也随之而来。一些不法分子趁机搭建虚假交易平台,打着"低门槛...
坚锅淘金APP投资者频繁爆仓亏...   坚锅淘金APP对外宣称是贵金属现货交易平台,日常出入金看似畅通无阻,给人一种合规运营的假象。但事...
斗金订购APP“5元订购现货”...   斗金订购APP“5元订购现货”骗局揭秘:充值易、回本难,越陷越深!  许多投资人在未核实平台合规...
贵金属APP乱象曝光:&quo...   当前市场上部分贵金属类APP未取得正规交易资质,涉嫌误导消费者参与白银、铂金等商品的非合规交易!...
华通白银、银宝街APP被指虚假...   警惕现货白银投资陷阱:上海华通白银背后的平台涉嫌非法期货交易  近年来,各类现货白银交易平台以“...
充值送300,月入过万?别被量...   如今,网络上充斥着大量未经批准的贵金属及其他产品订购交易平台。这些平台普遍缺乏合法经营资质,却将...
鑫汇智投APP贵金属非法期货、...   鑫汇智投APP贵金属非法期货、人为控盘,大量投资者遭恶意收割  鑫汇智投APP长期以“低门槛、高...
矅光智策APP非法贵金属交易骗...   不少投资人在矅光智策APP上进行贵金属交易后出现了严重亏损。许多人在下载该平台时,根本不清楚其是...
飞鸽订购APP非法期货交易骗局...   飞鸽订购APP非法期货交易骗局,很多投资者根本没搞懂规则就盲目充值,买涨买跌跟买cai票一样!平...
天龙白银APP被操控的非法期货...   中小投资者在网络平台参与商品现货订购交易,表面看似合规合法,实则暗藏诸多难以察觉的风险。商品现货...
下载送试玩金?千万别碰!带你揭...   当前,许多贵金属APP交易平台正采用欺诈性营销手段。它们通过抖音等短视频平台,以“5元起投”“充...
泡泡淘金APP骗局:打着&qu...   泡泡淘金APP骗局:打着"商品订购"幌子,实则非法期货收割投资者!投资需谨慎,切勿轻信“高额回报...
南商云购APP虚假电子盘背后的...   南商云购是虚假电子盘吗?它是否具备合规的交易资质?这个曾经的"现货电子盘"如今摇身一变,披上了"...
警惕"祥龙订购&qu...   祥龙订购APP、掌上银牛APP等平台背后的运营方——四川禄宏商品现货市场有限公司,仅具备现货交易...
中国白银、华银:虚假宣传、后台...   中国白银APP宣称是上市公司“中国白银集团”与“上海华通白银国际交易中心”旗下的现货交易平台,提...
起底“优品订购”APP非法期货...   “优品订购”APP根本不具备任何合法的交易资质。其背后的运营方仅凭随便注册一家公司、开发一款交易...