根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:
3
/ \
9 20
/ \
15 7
1 class Solution:
2 def buildTree(self, preorder, inorder):
3 """
4 :type preorder: List[int]
5 :type inorder: List[int]
6 :rtype: TreeNode
7 """
8 def helper(in_left = 0, in_right = len(inorder)):
9 nonlocal pre_idx
10 # if there is no elements to construct subtrees
11 if in_left == in_right:
12 return None
13
14 # pick up pre_idx element as a root
15 root_val = preorder[pre_idx]
16 root = TreeNode(root_val)
17
18 # root splits inorder list
19 # into left and right subtrees
20 index = idx_map[root_val]
21
22 # recursion
23 pre_idx += 1
24 # build left subtree
25 root.left = helper(in_left, index)
26 # build right subtree
27 root.right = helper(index + 1, in_right)
28 return root
29
30 # start from first preorder element
31 pre_idx = 0
32 # build a hashmap value -> its index
33 idx_map = {val:idx for idx, val in enumerate(inorder)}
34 return helper()

2019-9-20
1 class Solution: 2 def buildTree(self, preorder: List[int], inorder: List[int]) -> TreeNode: 3 if len(preorder)==0: 4 return None 5 if len(preorder)==1: 6 return TreeNode(preorder[0]) 7 root = TreeNode(preorder[0]) 8 inorderL = inorder[:inorder.index(preorder[0])] 9 inorderR = inorder[inorder.index(preorder[0])+1:] 10 root.left = self.buildTree(preorder[1:inorder.index(preorder[0])+1],inorderL) 11 root.right = self.buildTree(preorder[inorder.index(preorder[0])+1:],inorderR) 12 return root
2019-11-20 14:49:13
来源:https://www.cnblogs.com/NPC-assange/p/11511853.html