面试150 从前序与中序遍历构造二叉树
思路
本题要求根据前序遍历和中序遍历的结果构建一棵二叉树。首先,根据前序遍历的特性,其第一个元素一定是整棵树的根节点。我们可以通过该根节点的值,在中序遍历数组中找到对应的位置。这个位置将中序遍历数组分为左右两部分:左侧为左子树的中序遍历,右侧为右子树的中序遍历。
接下来,根据左子树中序遍历的长度,可以确定前序遍历中左子树和右子树对应的部分。然后对左右子树分别递归执行同样的构建过程,最终即可还原整棵二叉树。
# 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]:def construct(pre,ino):if not pre:return Nonevalue=pre[0]root=TreeNode(value)#根节点Index=ino.index(value) #找出根节点在中序中数组的位置ino_left=ino[:Index]ino_right=ino[Index+1:]pre_left=pre[1:1+len(ino_left)]pre_right=pre[1+len(ino_left):]root.left=construct(pre_left,ino_left)root.right=construct(pre_right,ino_right)return rootreturn construct(preorder,inorder)