问题描述:
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
示例
解题思路:
- 后序最后一个数为整个树的根节点
- 根据这个根节点去切分中序,该根节点的左边为左子树,右边为右子树
- 根据中序左子树去切分后序,将其切分左右子树,需要注意的是中序左右子树和后序左右子树长度相等
- 递归
代码如下:
class Solution:
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
# 1. 树空 (递归终止条件)
if not postorder:
return None
# 2. 后序最后一个数为根节点
root_val = postorder[-1]
root = TreeNode(root_val)
# 3. 找切割点 切割中序
split_index = inorder.index(root_val) # 切割点
inorder_left = inorder[:split_index]
inorder_right = inorder[split_index+1:]
# 4.根据中序左右长度 去切割后序
postorder_left = postorder[:len(inorder_left)]
postorder_right = postorder[len(inorder_left):len(postorder)-1]
# 5 后序成为两个子后序,再次进入递归
root.left = self.buildTree(inorder_left,postorder_left)
root.right = self.buildTree(inorder_right,postorder_right)
return root