如何在python中绘制这个树模式?

时间:2016-11-14 17:32:58

标签: python python-2.7 tree binary-tree

如果高度1 <= h <= 15,我该如何绘制这棵树?我以后需要能够遍历它以解决一些问题。

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

对于h = 2,

 3
1 2 

对于h = 3,

    7
  3   6
 1 2 4 5

等。

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

1 个答案:

答案 0 :(得分:3)

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

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,它可以定义为&#34;最大幂2的指数除以2n。&#34;它在视觉上看作是英寸标尺上连续标记的高度。这决定了一行中数字之间的值的增加。其余的代码应该是直截了当的。