从前序与中序遍历序列构造二叉树

· 约 1 分钟阅读 · 次阅读 leetcode

给定两个整数数组 preorder 和 inorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。


递归的思路

但是这里面的细节需要一些优化才能通过OJ

# 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]) -> TreeNode:
        if not preorder or not inorder:
            return None
        if len(preorder) <=1 or len(inorder) <= 1:
            return TreeNode(preorder[0])
        
        root_val = preorder[0]
        root = TreeNode(root_val)
        
        inorder_dict = {v:k for k, v in enumerate(inorder)}

        i = 0
        inorder_index = inorder_dict[root_val]
        left_tree_num = inorder_index
        right_tree_num = len(inorder) - inorder_index - 1
        
        root.left = self.buildTree(list(preorder[1:left_tree_num+1]), list(inorder[:inorder_index]))
        root.right = self.buildTree(list(preorder[1+left_tree_num:]), list(inorder[inorder_index+1:]))
        return root

迭代法

TODO