问题的一部分要求每个父母应覆盖其所有子女。如果添加父字符串太短下强调。任何剩余的空间都添加了时期。
*注意:输入树可以有很多孩子 *
到目前为止,我有一个函数(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]............
如何添加正确数量的下划线和周期?
我解决了您描述的问题,这比我预期的要多(尽管少于1,500字节代码。(基本模型是工作底部以获取下注,然后向下底部以获取填充。这是我定义为解决的函数的概述:
def height_tree(node):
递归,深度。简单的代码来计算树的高度。仅下一个功能才需要区分没有孩子的[a]
之类的节点,但需要一个伪造的填充才能工作,还有一个没有孩子的节点,我们不想添加假的。<<<<<<<<<<<<<</p>
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
设置为顶点的宽度,因为 covers 均已。倒数打印宽度直到达到零,输出新线,然后将打印宽度重置回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]............
>>>
我不太了解covere_tree函数的工作原理。你可以吗 请详细说明?
由于这是关键功能,让我们将其分解:
def covered_tree(node, level=0):
如果level
为零,则将level
设置为height_tree(node)
的结果。分为两个部分,一个父母(标签(和一个孩子列表(节点(。
进行我们的递归,创建一个新的儿童列表(节点(,这是每个孩子调用covered_tree()
的结果,但明确地通过level - 1
。对于这些新孩子,将其标签的len()
(宽度(总结。从这个tally中,减去父母标签的len()
(宽度(,宽度为2来说明括号。
现在我们准备创建返回节点了。这是一个元组,由:我们的父母用括号格式化以及上一步中刚刚计算的下划线数量;我们的新孩子名单。但是,如果有 no 儿童,和和 level
大于一个孩子,那么我们就退货了一个由孩子组成的孩子的伪造的孩子名单一串时期,他们自己的孩子是一个空的元组(即我们的空白列表。(此期间字符串的长度再次为我们父母标签的len()
(宽度(,以说明括号:
('[hello_____]', (('[a]', (('...', ()),)), ('[b______]', (('[cde]', ()), ('[fg]', ())))))