105. Construct Binary Tree from Preorder and Inorder Traversal
python
# 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]) -> Optional[TreeNode]:
if not preorder:
return
left_size = inorder.index(preorder[0])
left = self.buildTree(preorder[1:1+left_size], inorder[:left_size])
right = self.buildTree(preorder[1+left_size:], inorder[left_size+1:])
return TreeNode(preorder[0], left, right)
There is still can be imporved
写法二 上面的写法有两个优化点:
用一个哈希表(或者数组)预处理 inorder 每个元素的下标,这样就可以 O(1) 查到 preorder[0] 在 inorder 的位置,从而 O(1) 知道左子树的大小。 把递归参数改成子数组下标区间(左闭右开区间)的左右端点,从而避免复制数组。
pyth
class Solution:
def buildTree(self, preorder: List[int], inorder: List[int]) -> Optional[TreeNode]:
index = {x: i for i, x in enumerate(inorder)}
def dfs(pre_l: int, pre_r: int, in_l: int, in_r: int) -> Optional[TreeNode]:
if pre_l == pre_r: # 空节点
return None
left_size = index[preorder[pre_l]] - in_l # 左子树的大小
left = dfs(pre_l + 1, pre_l + 1 + left_size, in_l, in_l + left_size)
right = dfs(pre_l + 1 + left_size, pre_r, in_l + 1 + left_size, in_r)
return TreeNode(preorder[pre_l], left, right)
return dfs(0, len(preorder), 0, len(inorder)) # 左闭右开区间
作者:灵茶山艾府
链接:https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/solutions/2646359/tu-jie-cong-on2-dao-onpythonjavacgojsrus-aob8/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。