如果高度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但是这个不是一致的模式),但我似乎无法找到任何东西。因为我需要能够生成树,所以我也不确定如何使用堆结构。我也不确定从哪里开始递归。欢迎任何想法。
答案 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;它在视觉上看作是英寸标尺上连续标记的高度。这决定了一行中数字之间的值的增加。其余的代码应该是直截了当的。