-
Notifications
You must be signed in to change notification settings - Fork 71
/
Copy pathBinaryTree.py
116 lines (103 loc) · 3.66 KB
/
BinaryTree.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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#!/usr/bin/env python
from __future__ import division
from math import log10
class Node(object):
def __init__(self, value=0,
left=None, right=None,
id=None, parent=None):
self.id = id
self.left = left
self.right = right
self.value = value
self.parent = parent
def __str__(self):
if self.left is None and self.right is None:
return str(self.value)
else:
return '%s (%s, %s)' % (
str(self.value),
str(self.left),
str(self.right))
def __repr__(self):
s = 'TreeNode Object (id=' + str(self.id) + \
' value='+str(self.value)+')'
return s
def pretty_print(self):
# get each levels
level = [self]
to_prints = [[self.value]]
while True:
is_all_none = True
next_level = []
to_print = []
for n in level:
if n is None:
next_level += [None, None]
to_print += ['#','#']
else:
is_all_none = False
next_level += [n.left, n.right]
left_val = n.left.value if n.left and n.left.value else '#'
right_val = n.right.value if n.right and n.right.value else '#'
to_print += [left_val, right_val]
if is_all_none: break
level = next_level
to_prints.append(to_print)
#max_val_digits = max([max([len(str(v)) for v in r]) for r in to_prints])
#print max_val_digits
to_prints = to_prints[:-1] # remove the last row with only '#'
to_pretty_prints = []
to_prints.reverse()
for i, row in enumerate(to_prints):
row = map(str,row)
#row = [' '*(max_val_digits-len(v))+v for v in row]
sep = ' '*(2**(i+1) - 1)
space = ' '*(2**i - 1)
to_pretty_prints.insert(0, space + sep.join(row) + space)
print '\n'.join(to_pretty_prints)
root = Node(value=5,
left=Node(value=4,
left=Node(value=1,
right=Node(value=2))
),
right=Node(value=8,
left=Node(value=3),
right=Node(value=4,
left=Node(value=9),
right=Node(value=1))
)
)
BST = Node(value=5,
left=Node(value=2,
left=Node(value=1,
right=Node(value=1.5,
left=Node(value=1.2))),
right=Node(value=3)
),
right=Node(value=9,
left=Node(value=7),
right=Node(value=15,
right=Node(value=16)
)
)
)
root_with_id = Node(id=0,value=-3,
left=Node(id=1,value=-2,
left=Node(id=3,value=3,
left=Node(id=7,value=1,
left=Node(id=11,value=4)),
right=Node(id=8,value=1)),
right=Node(id=4,value=-1,
left=Node(id=9,value=4),
right=Node(id=10,value=2))
),
right=Node(id=2,value=2,
left=Node(id=5,value=-1),
right=Node(id=6,value=3,
right=Node(id=12,value=2))
)
)
if __name__ == '__main__':
root.pretty_print()
print
BST.pretty_print()