Часть проблемы включает добавление узла к любому листу, длина которого меньше высоты дерева. Новый узел должен состоять из дочернего элемента, где метка представляет собой строку периодов, а дочерние элементы - пустой кортеж. Длина периодов должна быть равна длине родительского элемента плюс 2 для учета скобок.
У меня есть одна функция, tree_height, которая возвращает высоту дерева, и другая, closed_tree, которая форматирует дерево, чтобы заключить в скобки вокруг каждого узла, и добавляет подчеркивания к любому узлу, строка которого недостаточно длинна, чтобы покрыть все его значения. дети.
def tree_height(node):
parent, children = node
max_height = 0
for child in children:
child_height = tree_height(child)
max_height = max(max_height, child_height + 1)
return max_height
def cover_tree(node, level=0):
level = tree_height(node)
parent, children = node
new_children = tuple(cover_tree(child) for child in children)
cover_len = 0
for childs in new_children:
cover_len += len(childs[0])
cover_len = cover_len -(len(parent))-2
new_parent = "[{}]".format(parent+'_'*cover_len)
return (new_parent, new_children)
Для дерева
("hello", (("a", ()), ("b", (("cde", ()), ("fg", ())))))
текущее дерево возврата,
('[hello_____]', (('[a]', ()), ('[b______]', (('[cde]', ()), ('[fg]', ())))))
но я хочу вернуться,
('[hello_____]', (('[a]', (('...', ()),)), ('[b______]', (('[cde]', ()), ('[fg]', ())))))
Другой пример:
("supercalifragilisticexpialidocious",(("a",(("b",(("candy",()),)),("onomatopoeia",()),)),("d",(("egg",(("f",()),)),)),))
хочу вернуться,
('[supercalifragilisticexpialidocious]', (('[a__________________]', (('[b____]', (('[candy]', ()),)), ('[onomatopoeia]', (('..............', ()),)))), ('[d__]', (('[egg]', (('[f]', ()),)),))))
Как это можно сделать?