樹與二叉樹簡介:
樹是一種資料結構,比如目錄結構,樹是一種可以遞迴定義的資料結構
樹是由n個節點組成的集合,如果n=0,那麼這是一顆空樹,如果n>0,那存在乙個節點作為樹的根節點,其他節點可以分為m個子樹,每個子樹本身又是一棵樹
一些概念:
根節點、葉子節點:a就是根節點,沒有子樹的都是葉子節點,如圖中的b、c、h、i、p、q、k、l、m、n都是葉子節點
樹的深度(高度):深度是4,就是層數
樹的度:樹的度是6,a下面有6個節點,e的度是2,f的度是3
孩子節點/父節點:a是b、c、d、e、f、g的父節點,b、c、d、e、f、g是a的孩子節點
子樹:b是一顆子樹,c是一顆子樹,d和h是一顆子樹,e和i、j、p、q是一顆子樹,f和k、l、m是一顆子樹,g和n是一顆子樹
二叉樹是一種特殊且常用的樹,度不超過2的樹(節點最多有兩個叉)
如圖a和b,節點只能從後面的往下拿,如果拿掉13,留下14、15就不是完全二叉樹,滿二叉樹也是一種完全二叉樹
二叉樹的儲存方式:
鏈式儲存方式:
順序儲存方式(列表):
父節點和左孩子節點的編號下標有什麼關係?
i~2i + 1
父節點和右孩子節點的編號下標有什麼關係?
i~2i + 2
堆分為大根堆和小根堆
大根堆:一顆完全二叉樹,滿足任一節點都比其孩子節點大
小根堆:一顆完全二叉樹,滿足任一節點都比其孩子節點小
堆排序過程:
1、建立堆
2、得到堆頂元素,為最大元素
3、去掉堆頂,將堆最後乙個元素放到堆頂,此時可通過一次調整重新使堆有序
4、堆頂元素為第二大元素
5、重複步驟3,直到堆變空
def shift(data,low,high):i = low # 父節點
j = 2 * i + 1 # 左孩子節點
tmp = data[i] # 父節點**
while j <= high: # high是最後乙個子節點,沒到子樹的最後
if j < high and data[j] < data[j + 1]: # 只要有右孩子並且左孩子比右孩子小
j = j + 1
if tmp < data[j]: # 如果領導不能幹
data[i] = data[j] # 小領導上位
i = j
j = 2 * i + 1
else:
break
data[i] = tmp
def heap_sort(data):
n = len(data)
for i in range(n // 2 - 1, -1, -1):
shift(data, i, n - 1)
for i in range(n - 1, -1, -1):
data[0], data[i] = data[i], data[0]
shift(data, 0, i - 1)
data = list(range(20))import random
random.shuffle(data)
heap_sort(data)
print(data)
二叉樹之堆排序
堆排序,首先要對堆的性質有了解,分大頂堆和小頂堆,我這次寫的是大頂堆,即父節點大於其子節點,在把堆無序後,從堆頂開始遍歷,得到大堆頂,把堆頂與最後乙個元素對換,這時,最後乙個元素就是最大值,這時,就不用考慮最後乙個元素了,開始迴圈。重新開始從頭遍歷,詳細過程寫在 裡,大家參考 此排序主要有2個難點,...
堆排序(完全二叉樹)
堆排序,一種全新的排序方式,運用了完全二叉樹存資料。假設根是u,那麼左兒子就是u 2,右兒子是u 2 1.用一維陣列手擼乙個堆排序。1,如何插入乙個數。heap size x up size 2,求集合中的最小值。heap 1 3,刪除最小值。heap 1 heap size size down 1...
二叉樹,排序二叉樹
說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...