forked from amitKr85/project_student_allocation
-
Notifications
You must be signed in to change notification settings - Fork 0
/
print_tree_to_file.py
41 lines (33 loc) · 1.94 KB
/
print_tree_to_file.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
def print_tree_to_file(current_node, childattr='children', nameattr='name', indent='', last='updown',file_to_print=None):
if hasattr(current_node, nameattr):
name = lambda node: getattr(node, nameattr)
else:
name = lambda node: str(node)
children = lambda node: getattr(node, childattr)
nb_children = lambda node: sum(nb_children(child) for child in children(node)) + 1
size_branch = {child: nb_children(child) for child in children(current_node)}
""" Creation of balanced lists for "up" branch and "down" branch. """
up = sorted(children(current_node), key=lambda node: nb_children(node))
down = []
while up and sum(size_branch[node] for node in down) < sum(size_branch[node] for node in up):
down.append(up.pop())
""" Printing of "up" branch. """
for child in up:
next_last = 'up' if up.index(child) is 0 else ''
next_indent = '{0}{1}{2}'.format(indent, ' ' if 'up' in last else '│', ' ' * len(name(current_node)))
print_tree_to_file(child, childattr, nameattr, next_indent, next_last,file_to_print=file_to_print)
""" Printing of current node. """
if last == 'up': start_shape = '┌'
elif last == 'down': start_shape = '└'
elif last == 'updown': start_shape = ' '
else: start_shape = '├'
if up: end_shape = '┤'
elif down: end_shape = '┐'
else: end_shape = ''
# print('{0}{1}{2}{3}'.format(indent, start_shape, name(current_node), end_shape))
file_to_print.write('{0}{1}{2}{3}'.format(indent, start_shape, name(current_node), end_shape)+"\n")
""" Printing of "down" branch. """
for child in down:
next_last = 'down' if down.index(child) is len(down) - 1 else ''
next_indent = '{0}{1}{2}'.format(indent, ' ' if 'down' in last else '│', ' ' * len(name(current_node)))
print_tree_to_file(child, childattr, nameattr, next_indent, next_last,file_to_print=file_to_print)