打印出树的内容,以便每个父项覆盖所有子项

时间:2019-06-29 18:16:29

标签: python function recursion tree tuples

部分问题要求每个父母都应该涵盖所有孩子。如果父字符串太短,则添加下划线。剩余的空间都添加了句点。

*注意:输入树可以具有任意数量的子代*

到目前为止,我有一个函数(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 个答案:

答案 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]', ())))))