Given two integer arrays preorder
and inorder
where preorder
is the preorder traversal of a binary tree and inorder
is the inorder traversal of the same tree, construct and return the binary tree.
Example 1:
Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7] Output: [3,9,20,null,null,15,7]
Example 2:
Input: preorder = [-1], inorder = [-1] Output: [-1]
解题思路:只要能充分理解二叉树前序遍历和中序遍历的数组的特性,这题就不会太难。前序遍历数组的第一个数永远是二叉树的根,第二个数开始剩下的前半部分为左子树,右半部分为右子树。关键是从哪里把数组分成左右两部分?这就要借助中序遍历数组的特性,如果已经知道根节点的值,那就可以在中序遍历数组里找到根节点的位置,根节点的左边部分为左子树,右边部分为右子树。由此就可以确定左右子树的长度,再根据左右子树的长度就可以确定前序遍历数组里对应的左右子树部分。把数组分成根节点,左子树和右子树部分之后,就可以通过递归调用进一步处理左子树和右子树数组,直到数组为空返回空节点结束。
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
n = len(preorder)
v2i = {}
for i in range(n) :
v2i[inorder[i]] = i
def helper(l1, r1, l2, r2) :
if l1 > r1 :
return None
root = TreeNode(preorder[l1])
index = v2i[preorder[l1]]
leftLen = index - l2
root.left = helper(l1 + 1, l1 + leftLen, l2, index - 1)
root.right = helper(l1 + leftLen + 1, r1, index + 1, r2)
return root
return helper(0, n -1, 0, n -1)