-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathbinary_tree_deserialize.py
75 lines (59 loc) · 1.64 KB
/
binary_tree_deserialize.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
from binary_tree import *
def deserialize_nf(nodes):
if nodes == None: return None
if len(nodes) == 0: return None
root = Node(nodes[0])
t = (len(nodes) - 1) / 2
lnodes = nodes[1:t + 1]
rnodes = nodes[t + 1:]
read_tree_nf(root, lnodes, rnodes)
return root
def deserialize_lr(nodes):
if nodes == None: return None
if len(nodes) == 0: return None
t = (len(nodes) - 1) / 2
root = Node(nodes[t])
lnodes = nodes[0:t]
rnodes = nodes[t + 1:]
read_tree_lr(root, lnodes, rnodes)
return root
def read_tree_lr(current, lnodes, rnodes):
if current == None: return
if len(rnodes) == 1:
if (rnodes[0] != None):
current.add_right(Node(rnodes[0]))
else:
t = (len(rnodes) - 1) / 2
r = Node(rnodes[t])
read_tree_lr(r, rnodes[0:t], rnodes[t + 1:])
current.add_right(r)
if len(lnodes) == 1:
if (lnodes[0] != None):
current.add_left(Node(lnodes[0]))
else:
t = (len(lnodes) - 1) / 2
l = Node(lnodes[t])
read_tree_lr(l, lnodes[0:t], lnodes[t+1:])
current.add_left(l)
def read_tree_nf(current, lnodes, rnodes):
if current == None: return
if len(rnodes) == 1:
if (rnodes[0] != None):
current.add_right(Node(rnodes[0]))
else:
t = (len(rnodes) - 1) / 2
r = Node(rnodes[0])
read_tree_nf(r, rnodes[1:t + 1], rnodes[t + 1:])
current.add_right(r)
if len(lnodes) == 1:
if (lnodes[0] != None):
current.add_left(Node(lnodes[0]))
else:
t = (len(lnodes) - 1) / 2
l = Node(lnodes[0])
read_tree_nf(l, lnodes[1:t + 1], lnodes[t + 1:])
current.add_left(l)
root = deserialize_nf(['A', 'B', 'D', 'E', 'C', 'F', None])
print root.to_string()
root = deserialize_lr(['D', 'B', 'E', 'A', 'F', 'C', None])
print root.to_string()