部分问题要求每个父母都应该涵盖所有孩子。如果父字符串太短,则添加下划线。剩余的空间都添加了句点。
*注意:输入树可以具有任意数量的子代*
到目前为止,我有一个函数(add_brackets),该函数根据问题的规范在每个字符串中添加括号。这些括号中会在需要时添加下划线。
第二个函数(下划线)计算需要多少个下划线。
最后一个函数递归地按级别顺序打印树。
我目前的想法是,我需要在add_brackets函数中应用下划线功能,并且在按水平顺序打印时需要使用add_brackets,但是我很难将它们全部放在一起。
def add_brackets(x):
row = ''
for i in x:
row = row+'['+i+']'
return row
def underscores(node):
parent, children = node
num = 0
for child in children:
num += len(child)+2
num -= 2
if len(parent) > canlen:
return
return '_'*num
def level_order(*nodes):
if not nodes:
return
labels,childrens = zip(*nodes)
print(add_brackets(labels))
flattened_children = [c for children in childrens for c children]
level_order(*flattened_children)
tree = eval(input('Enter tree: '))
print(level_order(tree))
以下树
tree = ("hello", (("a", ()), ("b", (("cde", ()), ("fg", ())))))
应该有输出,
[hello_____]
[a][b______]
...[cde][fg]
和
tree = ("supercalifragilisticexpialidocious",(("a",(("b",(("candy",()),)),("onomatopoeia",()),)),("d",(("egg",(("f",()),)),)),))
应该是
[supercalifragilisticexpialidocious]
[a__________________][d__]..........
[b____][onomatopoeia][egg]..........
[candy]..............[f]............
如何添加正确数量的下划线和句点?
答案 0 :(得分:0)
我解决了您描述的问题,这比我预期的要多(尽管少于1,500字节的代码。)基本模型是自下而上获得下划线,然后自下而上获得填充。这是我为解决此问题而定义的功能的概述:
def height_tree(node):
递归,深度优先。简单的代码来计算树的高度。只有下一个函数才需要这样做,以区分像[a]
这样的没有子节点但需要假装填充才能工作的节点,以及没有子节点的节点,我们不想为其添加节点假的。
def covered_tree(node, level=0):
递归,深度优先。先递归,然后计算下划线的覆盖范围。如果level
默认为零,则将其设置为上方的height_tree()
。返回有效的树:
('[hello_____]', (('[a]', (('...', ()),)), ('[b______]', (('[cde]', ()), ('[fg]', ())))))
,但父字符串已使用方括号和下划线进行了扩展。给[a]
和[onomatopoeia]
之类的节点伪造由句点填充组成的子项。
def padded_tree(node, tail=True):
递归,深度优先。先计算出填充,然后递归。仅处理分支最右边的填充,内部填充由上面的covered_tree()
处理。返回有效的树:
('[supercalifragilisticexpialidocious]', (('[a__________________]', (('[b____]', (('[candy]', ()),)), ('[onomatopoeia]', (('..............', ()),)))), ('[d__]..........', (('[egg]..........', (('[f]............', ()),)),))))
但父字符串已使用句点填充进行了扩展。
def print_tree(node, line_width=0):
迭代,广度优先。打印树,将line_width
设置为顶部节点的宽度,因为它覆盖了所有。递减打印宽度,直到达到零为止,输出换行符,然后将打印宽度重置回line_width
。
输出
>>> tree = ("hello", (("a", ()), ("b", (("cde", ()), ("fg", ())))))
>>> print_tree(padded_tree(covered_tree(tree)))
[hello_____]
[a][b______]
...[cde][fg]
>>>
>>> tree = ("supercalifragilisticexpialidocious",(("a",(("b",(("candy",()),)),("onomatopoeia",()),)),("d",(("egg",(("f",()),)),)),))
>>> print_tree(padded_tree(covered_tree(tree)))
[supercalifragilisticexpialidocious]
[a__________________][d__]..........
[b____][onomatopoeia][egg]..........
[candy]..............[f]............
>>>
我不太了解Covered_tree函数的工作原理。你是否可以 请详细点吗?
由于这是一项关键功能,因此我们将其分解:
def covered_tree(node, level=0):
如果level
为零,则将level
设置为height_tree(node)
的结果。将节点分为两部分:父节点(标签)和子节点列表(节点)。
进行递归,创建一个新的子级(节点)列表,该列表是对每个子级调用covered_tree()
但显式传递level - 1
的结果。对于这些新的子项,将其标签的len()
(宽度)加起来。从此计数中减去父标签的len()
(宽度)和宽度2,以计入括号。
现在我们准备创建返回节点。它是一个元组,包括:我们的父级使用方括号加上上一步中我们刚刚计算出的下划线数量;我们的新孩子名单。但是,如果没有 个子元素,而和 level
大于1,则我们将返回一个由a组成的伪造子列表,而不是空子列表子标签的名称是一串句号,而其子元素是一个空的元组(即我们的子列表为空)。该句号字符串的长度再次是父标签的len()
(宽度)加上2对于括号:
('[hello_____]', (('[a]', (('...', ()),)), ('[b______]', (('[cde]', ()), ('[fg]', ())))))