根据前序遍历和中序遍历获取后序遍历
PS:这道题不是leetcode原题,但是我们可以借鉴某些题目的思路
方法一是根据leetcode这道题的方法,构造出真正的二叉树结构,进而后序遍历即可,比较消耗空间,我们这里不表。
我把这道原题标准答案贴在这里,一会有用
class Solution:def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:def make_tree(i,lo,hi):if lo>=hi:return Nonek=lowhile k<hi:if inorder[k]==preorder[i]:breakk+=1node=TreeNode(preorder[i])node.left=make_tree(i+1,lo,k)node.right=make_tree(i+1+k-lo,k+1,hi)return nodereturn make_tree(0,0,len(inorder))
方法二:
根据上面原题解法的思路,遍历的顺序其实是不断地切分inorder数组获得子数组范围(也就是lo--hi),最终递归地生成子树,我们需要借鉴的是找到根节点的思路,也就是用while循环遍历然后传入i+1和i+1+k-lo这两个过程,这确保了我们每次传入的都是下个递归的根。
再看遍历顺序,这是一个很典型的根--左--右顺序(根在传入的时候就确定了是下标i的preorder)。
那么我们换个思路,生成的顺序变成根-右-左,这个顺序倒过来就是左右根,也就是后序遍历的顺序。根据这个顺序,我们遍历到就将其保存到返回数组里就可以了。
def get_postorder(preorder:list,inorder:list)->list:''':param preorder: 前序遍历:param inorder: 中序遍历:return: 二叉树的后序遍历'''ret=[]def search(i:int,lo:int,hi:int):if i>=len(preorder) or lo>=hi:returnroot=preorder[i]k=lowhile k<hi and inorder[k]!=root:k+=1ret.append(root)search(i+1+(k-lo),k+1,hi)#right treesearch(i+1,lo,k)#left treesearch(0,0,len(inorder))return ret[::-1]
这里有一组数据供尝试
#preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] #return postorder= [9, 15, 7, 20, 3]
根据前序遍历和中序遍历获取后序遍历相关推荐
- 由前序序列与中序序列实现后序遍历
二叉树是一种特殊的树,二叉树只有两个分支,分别是该节点的左儿子和右儿子. 前序遍历:就是先遍历根节点,然后再访问左子树与右子树.遍历子树的时候同样也是先遍历根节点然后在遍历他的左子树与右子树. 中序遍 ...
- PAT甲级1020 Tree Traversals:[C++题解]树的遍历、由中序序列和后序序列递归建树
文章目录 题目分析 题目链接 题目分析 题意重述:给定一棵二叉树的后序遍历序列和中序遍历序列,让求层次遍历的序列. 分析: 后序遍历:先 左子树.右子树 ,最后再遍历根结点. 中序遍历:先左子树,再根 ...
- 二叉树的构造(前序+中序)---(后序 + 中序)
二叉树的构造(前序+中序)-(后序 + 中序) 思路:要对前序+中序(后序+中序)的构建树的动态过程要了解,思路比较简单,在了解了这个过程之后,理解下面代码就容易了. 过程 参考图: 前序 + 中序: ...
- 后序遍历的非递归算法python_二叉树后序遍历(递归与非递归)算法C语言实现...
二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素. 图 1 二叉树 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 ...
- Algorithm Gossip (22) 中序式转后序式(前序式)
前言 This Series aritcles are all based on the book <经典算法大全>; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行 ...
- 通过前序序列和中序序列或中序序列和后序序列还原二叉树(Java)
首先看一下这个二叉树的结构,回忆一下前序序列的输出方式(中前后),中序序列的输出方式(前中后),后序序列的输出方式(前后中). 前中序列还原二叉树 此二叉树的前中序列如下所示,我们要做的就是通过这两个 ...
- 7-10 先序序列创建二叉树,输出先序序列、中序序列、后序序列并输出叶子结点数 (10 分)
7-10 先序序列创建二叉树,输出先序序列.中序序列.后序序列并输出叶子结点数 (10 分) 对于给定的二叉树,输出其先序序列.中序序列.后序序列并输出叶子结点数. 输入格式: 二叉树的先序遍历序列. ...
- 已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法...
已知一棵二叉树的中序序列和后序序列,写一个建立该二叉树的二叉链表存储结构的算法 #define N 10 //二叉树节点的个数 char postorderstr[]={};//后序序列 char i ...
- 栈的应用--中序表达式转后序表达式
栈的应用--中序表达式转后序表达式 infix : a+b*c+(d*e+f)*g postfix : abc*+de*f+g*+ 有以下四种情况: 操作数->直接输出 操作符->将栈顶输 ...
- Algs4-1.3.10中序表达式转为后序表达式(第二次实现)
1.3.10编写一个过滤器InfixToPostfix,将算术表达式由中序表达式转为后序表达式. 答:本次做这个题时离上次做这个题有一个半月了,已经忘记了当时的算法.经过两个小时的研究(远低于第一次 ...
最新文章
- drf-频率组件 权限组件
- 华为鸿蒙ai字幕,EMUI11一个值得吹爆的功能?AI字幕,支持翻译英日韩
- 对计算机网络设备的认识,计算机入门知识:你有必要认识的网络设备及工具
- 服务器本地文件,云服务器 本地文件
- Android访问瓦片地图 费流量,瓦片地图服务在线资源访问总结
- js原生设计模式——3简单工厂模式\简单工厂模式封装简单对象
- React Native – 使用 JavaScript 开发原生应用
- scala特性_Scala特性示例教程
- 今日头条算法及技术架构分析
- [笔记]树的计数 Prufer序列+Cayley公式
- win7系统下使用虚拟机安装专利电子申请客户端(CPC软件)以及专利文件生成过程
- Linux Capability探索试验
- 2019年 8月7日 日报
- 【Android Studio】在Mac中更换JDK Location
- python入门(四)小康小白
- 处理tcga突变数据一点思考
- 【软件测试】:电梯、杯子、笔、桌子、洗衣机,设计测试用例?
- 西电“可展开天线”项目获2013年度国家科学技术进步二等奖
- HTML CSS 如何设置颜色
- 用网络进行内核调试 VMware+windbg