(python)小菜狗算法日记(二叉树系列)_leetcode 105面试题07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

限制:

0 <= 节点个数 <= 5000

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof
前序是根左右,中序是左根右。前序的第一个值是数的根,因为所给数不重复,可以用这个树找到中序的根的位置,则中序中根左边为左子树,根右边为右子树。

重复根据前序中的根去中序中找到根位置再划分左右,所以这可以用递归来解决,关键是递归的输入输出和返回值。一个核心的点是在中序中找的的这个根的位置不仅可以划分中序的左右,也能划分前序的左右,如示例中中序左子树+根的长度为2(index0,1),则前序左子树+根的长度也是2(index0,1).前序中序都是去掉左+根的固定长度就是右的固定长度。

整个思路就是用前序的排序帮助中序找到根

递归终止条件,list中没有值;递归重复做的事,根据前序的根找到中序根的位置,并用这个位置划分前序中序的左右子树list;递归返回值,返回根节点

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        if not preorder or not inorder:
            return None
        root = TreeNode(preorder[0])
        root_pos = inorder.index(preorder[0])
        root.left = self.buildTree(preorder[1:root_pos+1],inorder[:root_pos])
        root.right = self.buildTree(preorder[root_pos+1:],inorder[root_pos+1:])
        return root

inorder[9,3,15,20,7] 根3位置pos为1,左子树[:1]右子树[pos+1:] ([2:]从第3个index2到最后)

preorder[3,9,20,15,7] 左子树[1:pos+1],右子树[pos+1:]

你可能感兴趣的:((python)小菜狗算法日记(二叉树系列)_leetcode 105面试题07. 重建二叉树)