中序和后序遍历恢复二叉树python(年度更新系列)
输入:inorder = [9,3,15,20,7], postorder = [9,15,7,20,3]
输出:[3,9,20,null,null,15,7]
恢复一棵树一般是由中序+后续or先序,便于从队列的头或者尾部直接找出根结点,再利用下标二次划分子树,通过递归去求解问题。
class Solution(object):
def buildTree(self, inorder, postorder):
if len(inorder) == 0:
return None
#如果队列为空则直接返
# 根节点的值为后序遍历的最后一个元素值
rootVal = postorder[-1]
# 创建根节点
root = TreeNode(rootVal)
# 用根节点的值去中序数组中查找对应元素下标
midIndex = inorder.index(rootVal)
# 找出中序遍历的左子树和右子树
# 左子树区间为 [0,midIndex),右子树区间为[midIndex+1,n-1]
inorderLeft = inorder[:midIndex]
inorderRight = inorder[midIndex + 1:]
# 找出后序遍历的左子树和右子树
# 后序遍历和中序遍历的左子树和右子树长度相等,所以可以通过中序遍历左右子树的长度来确定后序遍历左右子树的位置 postorderLeft = postorder[: len(inorderLeft)]
postorderRight = postorder[len(inorderLeft): len(inorder) - 1]
# 递归遍历左子树
root.left = self.buildTree(inorderLeft, postorderLeft)
# 递归遍历右子树
root.right = self.buildTree(inorderRight, postorderRight)
return root