【问题标题】:How do I draw this tree pattern in python?如何在 python 中绘制这种树形图案?
【发布时间】:2016-11-14 17:32:58
【问题描述】:

给定高度 1

对于 h = 1,只有标记为 1 的根。

对于 h = 2,

 3
1 2 

对于 h = 3,

    7
  3   6
 1 2 4 5

等等。

到目前为止,真正引起轰动的是试图从自上而下找到关系(对于左侧树,左节点将是 (parent-1)/2,而右子节点是 parent-1,但这不是一致的模式),但我似乎找不到任何东西。由于我需要能够生成树,我也不确定如何使用堆结构。我也不确定从哪里开始递归。欢迎任何想法。

【问题讨论】:

  • 深度优先搜索,一旦访问了所有子节点,就会标记节点
  • 你确定数字 1 是树的叶子,在底部吗?它通常放置在树的根部,即树的顶部。然后公式变得更容易。
  • @RoryDaulton:是的,就是这个。
  • 对于h=4,右子树是左子树,每个元素都添加了七个(左子树的根)。
  • @PatrickHaugh 这些是一些很棒的想法,谢谢。我已经在研究它们了。

标签: python python-2.7 tree binary-tree


【解决方案1】:

您的树可以递归绘制,但这里是非递归代码。

def ruler(n):
    result = 1
    while not (n & 1):
        n >>= 1
        result += 1
    return result

def printtree(h):
    widthofnum = len(str(2**h - 1))
    for row in range(h, 0, -1):
        maxcol = 2**(h - row)
        width = 2**(row-1) * (widthofnum + 1) - 1
        valincr = 2**row - 2
        val = valincr + 1
        for col in range(1, maxcol + 1):
            print(str(val).center(width), end=' ')
            val += ruler(col) + valincr
        print()

printtree(3)

打印出来的

   7    
 3   6  
1 2 4 5 

printtree(5) 给予

                       31                       
           15                      30           
     7           14          22          29     
  3     6     10    13    18    21    25    28  
1  2  4  5  8  9  11 12 16 17 19 20 23 24 26 27 

间距对于较大的数字可能并不理想,但它确实有效。请注意,为简化代码,每一行至少以一个空格结尾。 print 语句意味着这是 Python 3.x 代码。这种非递归代码让我们可以从上到下、从左到右打印,而无需任何回溯或存储字符串。但是,这会使所涉及的计算复杂化。

该代码的一个关键是离散的ruler function,它可以定义为“2 的最大幂除以 2n 的指数”。它更直观地被视为英寸标尺上连续标记的高度。这决定了连续数字之间值的增加。其余代码应该很简单。

【讨论】:

  • 哇,这很有帮助,谢谢。作为进一步的修改,我想将其构建为一棵树,以便能够遍历这些节点。对此有任何建议(或单独的问题)?
  • @tvishwa107:是的,这应该是一个单独的问题,所以请继续单独提问。但是请确保您澄清了“树”的含义,因为有多种方法可以定义一个(列表、嵌套列表、类的实例等)。还要说明树的每个节点中有哪些数据,例如我们上面使用的数字是否存储在树中。
猜你喜欢
  • 1970-01-01
  • 2015-06-06
  • 1970-01-01
  • 2011-01-04
  • 2019-01-16
  • 2021-12-19
  • 2021-02-09
  • 1970-01-01
  • 2016-07-06
相关资源
最近更新 更多