# 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
# 首先我们需要明白,二叉树的前序遍历,中序遍历和后序遍历分别是什么。
# 前序遍历:根——左——右
# 中序遍历:左——根——右
# 后序遍历:左——右——根
# 因此我们可以看到这个案例
# 中序遍历 inorder = [9,3,15,20,7]
# 后序遍历 postorder = [9,15,7,20,3]
# 后序遍历的根节点一定是在最后,那我们可以根据后序遍历寻找到根节点,
# 然后根据根节点的值找到根节点在中序遍历中的位置,在中序遍历中根节点左边的是
# 左子树,右边是右子树,那么我们找到左右子树的长度,
# 而在后序遍历中,前边是左子树,中间是右子树,最后是根节点。
# 那么我们可以根据左子树和右子树的长度来继续进行遍历。
# ps:这里我们所说的前提都是在二叉树的所有节点都不重复的前提下。
class Solution:
def buildTree(self, inorder: List[int], postorder: List[int]) -> TreeNode:
return self.dfs(inorder,postorder)
def dfs(self,inorder,postorder):
# 这里如果列表为空,那么就返回None,代表着已经到了叶子节点。
if inorder == []:
return None
# 找到根节点。
val = postorder[-1]
# 找到根节点在中序遍历列表的位置
for i in range(len(inorder)):
if inorder[i] == val:
break
# 定义根节点。
root = TreeNode(val)
# 继续向下遍历,寻找左右子树。
root.left = self.dfs(inorder[:i],postorder[:i])
root.right = self.dfs(inorder[i+1:],postorder[i:len(postorder) - 1])
# 最后返回。
return root