题目: 返回与给定的前序和后序遍历匹配的任何二叉树.pre
和 post
遍历中的值是不同的正整数.
来源: https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-postorder-traversal/
法一: 官方代码 注意这个题中的答案实际上不唯一
思路: 这里面用了二叉树递归方法中一个很典型的模板,类似于236二叉树的最近公共祖先中做标记的方法,要理解其精髓.
# Definition for a binary tree node. class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None from typing import List class Solution(object): def constructFromPrePost(self, pre, post): if not pre: return None root = TreeNode(pre[0]) # 如果前序只有一个元素了,说明左子树或右子树只有一个元素了,直接返回 if len(pre) == 1: return root # 加一是因为索引是从0开始的,这里计算的是实际长度 L = post.index(pre[1]) + 1 # 注意这里是切片操作,每次传过去的都是新的引用 root.left = self.constructFromPrePost(pre[1:L+1], post[:L]) root.right = self.constructFromPrePost(pre[L+1:], post[L:-1]) return root if __name__ == '__main__': duixiang = Solution() pre = [1, 2, 4, 8, 9, 5, 10, 3, 6, 7, 11, 13, 14, 12] post = [8, 9, 4, 10, 5, 2, 6, 13, 14, 11, 12, 7, 3, 1] a = duixiang.constructFromPrePost(pre=pre, post=post) print(a)