给定一个列表,打印为完全二叉树,例如:[10,20,80,40,50,10,60,70,90,91,92,93,94,95,96]
案例一:
def print_tree(array):
'''
this is a function for print tree
'''
import math
index = 1
depth = math.ceil(math.log2(len(array)))
sep = ' '
for i in range(depth):
offset = 2 ** i
print(sep * (2 ** (depth - i - 1) - 1), end='')
line = array[index:index + offset]
for j, x in enumerate(line[:-1]):
print('{:>{}}'.format(x, len(sep)), end='')
interval = 0 if i == 0 else 2 ** (depth - i) - 1
print(sep * interval, end='')
else:
print(line[-1])
index += offset
origin = [0,10,20,80,40,50,10,60,70,90,91,92,93,94,95,96] # 为方便理解计算添加一个0
print_tree(origin)
运行结果:
10
20 80
40 50 10 60
70 90 91 92 93 94 95 96
从打印结果看此树是完全二叉树也是满二叉树
案例二:
import math
def heap_print(lst):
length = len(lst) #算出总长度
layer = math.ceil(math.log2(length + 1)) #算出总长度可以排列的完全二叉树的层数
index = 0 #从索引0开始元素
width = 2 ** layer -1 #二叉树的最长宽度
for i in range(layer): #对每层进行打印,这里的i值为0,1,2,3
for j in range(2 ** i): #2**i为第i层中可以打印的个数
print("{0:^{1}}".format(lst[index],width),end=' ') #开始从索引0打印,每个元素在宽度值居中,第1行的宽度15,注意此处打印完每个元素居中之后,需要补空格(元素之间有上面根的投影)
index += 1 #索引往后移动1位,取下一值
if index >= length: #判断是否取到最后一个叶子的索引则停止
break
width = width//2 #每次对元素的宽度值
print()
lst = [1,2,3,4,5,6,7,8,9]
heap_print(lst)
运行结果:
1
2 3
4 5 6 7
8 9