LeetCode #105. Construct Binary Tree from Preorder and Inorder Traversal

题目

105. Construct Binary Tree from Preorder and Inorder Traversal


解题思路

先序遍历中的第一个位置就是整个树的根,在中序遍历中找到这个根的位置后可以把它分为左右两个部分,分别对两个部分再进行递归即可。

如果采用字典的方法代替index方法,可以将时间复杂度从O(n^2)降低到O(n)。


代码

不使用字典

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

使用字典

class Solution:
    def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode:
        map_inorder = {}
        for i, val in enumerate(inorder):
            map_inorder[val] = i
        
        def recur(low, high):
            if low > high:
                return None
            x = TreeNode(preorder.pop(0))
            mid = map_inorder[x.val]
            x.left = recur(low, mid - 1)
            x.right = recur(mid + 1, high)
            return x
        
        return recur(0, len(inorder) - 1)
posted @ 2020-10-21 11:29  老鼠司令  阅读(64)  评论(0编辑  收藏  举报