剑指 Offer 07. 重建二叉树
链接:https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/
前序和中序重建二叉树,先在前序中找到根节点,然后在中序列表中找到根节点的位置,然后递归分别建立左右子树。这里可以用哈希表存储中序各个节点的位置,避免递归的时候在中序中找到根节点需要每次遍历中序列表。时间复杂度O(N), 空间复杂度O(N)
# 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:
self.root_loc, self.preorder = {}, preorder
for i, node in enumerate(inorder): #记录中序列表中每个节点的位置
self.root_loc[node] = i
return self.dfs(0, 0, len(inorder)-1)
def dfs(self, pre_root, in_left, in_right):
if in_left > in_right:
return None
root = TreeNode(self.preorder[pre_root])
i = self.root_loc[self.preorder[pre_root]]
root.left = self.dfs(pre_root+1, in_left, i-1)
root.right = self.dfs(pre_root+i-in_left+1, i+1, in_right)
return root