列印堆資料結構
阿新 • • 發佈:2021-01-29
列印堆資料結構
先手動繪製了一個堆結構
00
==================
01 02
========== ==========
03 04 05 06
====== ====== ====== ======
07 08 09 10 11 12 13 14
觀察記錄一些資料
行開頭空格數 | 值間空格數 |
---|---|
14 | |
6 | 14 |
2 | 6 |
0 | 2 |
根據規律
空格數量計算程式(python)
from math import log2, floor
x = 0
kg = [0] # 存放每一行,行開頭的空格數量
lineMax = floor(log2(15)) # 計算堆高度
for _ in range(lineMax):
x = (x + 1) * 2
kg.append(x)
# 反轉列表
kg.reverse()
print(kg)
輸出
[14, 6, 2, 0]
觀察記錄的資料
根據(值間空格數),值的規律發現
當前(行開頭空格數),可以作為下一行的(值間空格數)
下面是完整程式
from typing import List
from math import log2, floor
def parent (i: int) -> int:
"""父節點"""
return int((i + 1) / 2) - 1
def showHeap(arg: List) -> None:
"""顯示堆結構"""
# 空列表直接返回
if not len(arg):
return
lineMax = floor(log2(len(arg))) # 計算堆高度
kg = [0] # 存放每一行,行開頭的空格數量
# 與上面的空格演算法有所區別,功能是一樣的
for _ in range(lineMax):
kg.insert(0, (kg[0] + 1) * 2)
kgIndex = 0 # 選擇空格數量的下標
gap = -1 # 值間空格數量下標
lineSize = 1 # 每行值的數量
lastly = parent(len(arg) - 1) # 最後一個節點的父節點
while True:
# 列印行開頭空格
print(" " * kg[kgIndex], end='')
# 列印值
for j in range(lineSize):
index = lineSize + j - 1
if index < len(arg):
print("%02d" % (arg[index], ), end='')
if j != lineSize - 1:
print("%s" % (' ' * kg[gap]), end='')
kgIndex += 1
gap += 1
if kgIndex >= len(kg):
break
# 列印 ===... 行的開頭空格
print("\n%s" % (' ' * kg[kgIndex]), end='')
# 列印 ===...
for j in range(lineSize):
index = lineSize + j - 1
if index <= lastly:
print("%s" % ("=" * (kg[gap] + 4)), end="")
if j != lineSize - 1:
print("%s" % (' ' * kg[gap]), end='')
print()
lineSize *= 2 # 下一行數量是當前行的兩倍
呼叫
array = [i for i in range(13)]
showHeap(array)
array = [i for i in range(20)]
showHeap(array)
輸出
00
==================
01 02
========== ==========
03 04 05 06
====== ====== ======
07 08 09 10 11 12
00
==================================
01 02
================== ==================
03 04 05 06
========== ========== ========== ==========
07 08 09 10 11 12 13 14
====== ====== ======
15 16 17 18 19