根据一棵树的前序遍历与中序遍历构造二叉树。
注意:
你可以假设树中没有重复的元素。
例如,给出
前序遍历 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