根据一棵树的中序遍历与后序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
中序遍历 inorder = [9,3,15,20,7]
后序遍历 postorder = [9,15,7,20,3]
返回如下的二叉树:
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal
先了解了下各种遍历:
1.前序遍历:先访问根节点——左子树——右子树。
2.中序遍历:先访问左子树——根节点——右子树,按照这个顺序。
3.后序遍历:和前面差不多,先访问树的左子树——右子树——根节点。
4.按层遍历:把一棵树从上到下,从左到右依次写出来
还看到了两个定理:
定理1: 任何n(n≥0)个不同节点的二叉树,都可由它的中序序列和先序序列唯一地确定。
定理2: 任何n(n>0)个不同节点的二叉树,都可由它的中序序列和后序序列唯一地确定。
那问题主要就是,你不知道下一个元素是上一级还是右边,还是右子树的根等等位置.
先划分第一层,哪些是左子树,哪些右,哪个是根,特点就是左右可能都有很多,但根只有一个
所以后序遍历找根非常方便,即最后一个元素
本来想a[len(a)-1],结果发现有更方便的写法 : a[-1]
接着的思路就是循环,把左右子树拆出来,每个的后序遍历,最后一个元素还是根元素
再之后就看的答案了,树是什么样的类来表示完全不清楚,个人感觉每一层有的有,有的空,可能每个节点还未必只有两个分岔,可能需要记录层数,层内元素,层内元素位置(继承哪个父节点的第几个子节点).
转载的,后加了注释
class Solution:
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
if not inorder or not postorder: return None
root = postorder[-1] #找最后一个当作根节点
res = TreeNode(root) #应该是建树的函数
i = inorder.index(root) #知道根节点在中序遍历的位置
res.left = self.buildTree(inorder[:i],postorder[:i]) #原来能直接建树,循环都免了
res.right = self.buildTree(inorder[i+1:],postorder[i:len(postorder)-1])
return res
作者:akari-5
链接:https://leetcode-cn.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/solution/python3di-gui-jian-ming-zhi-guan-de-dai-ma-xin-sho/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
输出如下
原来二叉树输出还是个数组,默认每个节点两个分岔,没有的地方显示空.
1.二叉树的python代码
res = TreeNode(root) #建树,root是根
res.left = self.buildTree(inorder[:i],postorder[:i]) #直接用两种排序建树
res.right = self.buildTree(inorder[i+1:],postorder[i:len(postorder)-1])
2.python基础用法
一个数组a=[0,1,2,3,4],a[-1]表示数组中最后一位,a[:-1]表示从第0位开始直到最后一位,a[::-1]表示倒序,从最后一位到第0位。
index() 函数用于从列表中找出某个值第一个匹配项的索引位置。
ps:第一次写,发现没中文标点,看起来非常奇怪
多个空格和回车没效果??