题目
解析
观察前序遍历和中序遍历可以发现,前序遍历的第一个节点是根节点,从中序遍历中找到这个节点的位置,这个节点左边是左子树,右遍是右子树。根据这样的规律,我们可以用前序遍历的顺序作为索引,将中序遍历进行不断切分来构造树。递归函数的详情如下:
- 新建一个全局变量preindex,代表在前序遍历中的位置,在递归过程中每次递归这个变量加1
- 递归函数接受两个参数,分别是左边界和右边界。这两个边界代表递归所在的当前节点作为根节点的左子树或者右子树在中序遍历中的范围
- 当左边界等于右边界,说明当前递归的树构造已经完成,返回空指针即可
- 如果不相等,构造一个新的节点,节点的值为当前preindex对应preorder中的节点值
- 找到这个节点值在中序遍历中的位置,这个节点左边为左子树,右边为右子树,所以当前节点的左右子节点可以根据这个规律进行递归
python代码如下:
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
def helper(left_bound,right_bound):
nonlocal preindex
if left_bound == right_bound: