1. 程式人生 > 其它 >列印堆資料結構

列印堆資料結構

技術標籤:堆列印python資料結構堆疊堆排序

列印堆資料結構

先手動繪製了一個堆結構

              00
      ==================
      01              02
  ==========      ==========
  03      04      05      06
======  ======  ======  ======
07  08  09  10  11  12  13  14

觀察記錄一些資料

行開頭空格數值間空格數
14
614
26
02

根據規律

空格數量計算程式(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