樹和樹結構 1 二叉堆和堆排序

2021-07-09 04:19:17 字數 2543 閱讀 8154

樹結構

樹是一種重要的非線性資料結構,直觀地看,它是資料元素(在樹中稱為結點)按分支關係組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示。

定義一棵樹(tree)是由n(n>0)個元素組成的有限集合,其中:

(1)每個元素稱為結點(node);

(2)有乙個特定的結點,稱為根結點或根(root);

(3)除根結點外,其餘結點被分成m(m>=0)個互不相交的有限集合,而每個子集又都是一棵樹(稱為原樹的子樹)

一棵樹可以直觀的表示為

1

/\

23

/\

4

5

樹有一些重要的概念, 如:

度 樹的度——也即是寬度,簡單地說,就是結點的分支數。以組成該樹各結點中最大的度作為該樹的度,如上圖的樹,其度為3;樹中度為零的結點稱為葉結點或終端結點。樹中度不為零的結點稱為分枝結點或非終端結點。除根結點外的分枝結點統稱為內部結點。

樹的深度 ——組成該樹各結點的最大層次,如上圖,其深度為3;

層次 根結點的層次為1,其他結點的層次等於它的父結點的層次數加1.

完全二叉樹 除最後一層外,每一層上的節點數均達到最大值;在最後一層上只缺少右邊的若干結點。

二叉堆堆(英語:heap)是電腦科學中一類特殊的資料結構的統稱。堆通常是乙個可以被看做一棵樹的陣列物件。堆總是滿足下列性質:

(1)堆中某個節點的值總是不大於或不小於其父節點的值;

(2)堆總是一棵完全樹。

其中, 符合堆性質的完全二叉樹稱為二叉堆.根據定義, 二叉堆可以分為大根堆和小根堆.例如下圖是乙個小根堆:

1

/\

37

/\

/

12

1514

不難發現, 堆可以用來高速的查詢最大值(或最小值). 因此, 弗羅依德(floyd)同他人一起發明了基於堆的堆排序演算法. 其中, 堆的主要操作有三個--push(), pop(), top()

**與實現

1, 堆的資料結構(**來自tocl)

因為堆始終是一棵完全二叉樹, 可以直接用陣列儲存, 即按照編號儲存. 例如上乙個圖中的堆可以表示為:

137

1215

14

不難發現, 每個節點i的左孩子編號為2i, 右孩子為2i+1. 因此寫出堆的陣列儲存(這裡用指標實現)

template //泛型模板, 可以使用heaph; 建立乙個int型別的小根堆.

class heap

~heap()

...};

2, 入堆的操作push()

將乙個節點插入堆的方法是: 先將節點加入陣列, 然後不斷的向上比較. 如果已經滿足堆的性質(這裡指父節點已經比當前節點小), 即退出; 否則將此節點和父節點交換, 並再次向上比較, 直到滿足性質或到達堆頂.

void push (t data) 

else

}}

3, 將優先順序最大的節點退出堆 pop()

退出堆的演算法是: 將根節點用最末尾的節點代替, 並將堆的大小-1. 再自頂而下的選擇較小的子節點. 若當前節點優先順序小於其優先順序較大的子節點, 則交換之, 並繼續向下更新, 知道滿足性質或到達堆的末尾.

t pop () 

return res;

//返回優先順序最大的值

}

4, 獲取堆頂(可以不寫)

很簡單, 直接獲取陣列第乙個即為根

t top () 

5, 堆排序

也很簡單, 通過多次push建乙個堆, 再用pop逐個取出.

template void heap_sort (t array, int begin, int end)

6, 堆排序的效率和穩定性分析

堆排序的時間,主要由建立初始堆和出堆這兩部分的時間開銷構成.建立堆的時間複雜度為o(nlogn), 出堆的複雜度也為o(nlogn), 總效率為o(nlogn). 而且堆排序不會出現快速排序的最壞情況, 是一種高效的排序演算法(尤其是在資料量很大的情況下).

它是不穩定的排序方法.

7, 堆的其他用途

由push和pop可以看到, 堆可以作為高效的優先佇列.

思考1, 演算法導論中使用了一種更為高效的建堆方法, 可以**一下.

2, 試著用遞迴方法改寫push和pop函式

二叉堆和堆排序

二叉 堆是乙個陣列,它可以近似看作完全二叉樹。樹上的每乙個節點對應陣列中的乙個元素。除了最底層,該樹是完全充滿的,而且是從左向右填充。根據節點下標可以求出對應的子樹和雙親 parent i return i 2 i表示陣列中的第幾個元素,i 2 表示取整數 left i return 2 i rig...

7 樹結構和二叉樹

6.樹結構和二叉樹 樹結構中每個元素最多只有乙個前驅,但可能有多個後繼,體現出明顯的層次關係。6.1樹的相關概念 6.2樹的儲存結構與遍歷 6.3二叉樹 樹的基本概念 需要注意的是葉子節點的高度為0,如果樹只有乙個節點,那麼這個節點的高也是0 需要注意的是根節點的深度 depth 是0.從heigh...

新手講排序 堆排序 和 認識二叉堆

二叉堆是完全二叉樹或者是近似完全二叉樹 二叉堆滿足的二個特性 1.父節點的鍵值總是大於或等於 小於或等於 任何乙個子節點的鍵值 2.每個節點的左子樹和右子樹都是乙個二叉堆 都是最大堆或者是最小堆 當父節點的鍵值總是大於或等於任何乙個子節點的鍵值時為最大堆,總是小於或等於任何乙個子節點的鍵值時為最小堆...