forked from exercism/python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathexample.py
More file actions
17 lines (17 loc) · 852 Bytes
/
example.py
File metadata and controls
17 lines (17 loc) · 852 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def tree_from_traversals(preorder, inorder):
if len(preorder) != len(inorder):
raise ValueError("traversals must have the same length")
if set(preorder) != set(inorder):
raise ValueError("traversals must have the same elements")
if len(set(preorder)) != len(preorder) != len(set(inorder)):
raise ValueError("traversals must contain unique items")
if not preorder:
return {}
value = preorder.pop(0)
index = inorder.index(value)
left_inorder, right_inorder = inorder[:index], inorder[index+1:]
left_preorder = [x for x in preorder if x in left_inorder]
right_preorder = [x for x in preorder if x in right_inorder]
left = tree_from_traversals(left_preorder, left_inorder)
right = tree_from_traversals(right_preorder, right_inorder)
return {"v": value, "l": left, "r": right}