二叉樹與堆排序

2022-06-08 09:27:10 字數 1703 閱讀 9721

樹與二叉樹簡介:

樹是一種資料結構,比如目錄結構,樹是一種可以遞迴定義的資料結構

樹是由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...

二叉樹,排序二叉樹

說到二叉樹,這可是資料結構裡面的非常重要的一種資料結構,二叉樹是樹的一種,本身具有遞迴性質,所以基於二叉樹的一些演算法很容易用遞迴演算法去實現。作為一種非線性結構,比起線性結構還是相對複雜的,很多人甚至看不懂演算法的意思,不能理解。其實一開始接觸這些東西還是挺暈的,不過你多看幾遍,上機實現可能你就會...