最優生成樹c語言 C語言 資料結構 構造哈夫曼樹

2021-10-16 11:18:37 字數 1547 閱讀 6306

給定n個權值的集合w=

1.在w中選取兩個最小的權作為兄弟結點,以它們的權值之和作為其父結點,得到一棵新樹;

2.在w中刪除上述已選取的權值,以它們的權值之和作為新的權值加入w中;

3.在已構造的二叉樹中重複①、②,直至w中只含有乙個權重值,這棵二叉樹就是所要建立的哈夫曼樹(構造出有n個葉結點,葉結點相應的權值為w1,w2…wn的一棵樹)

假定仍採用圖6-11中的四個帶權葉子結點來構造一棵哈夫曼樹,按照上述演算法,則構造過程如圖6-12所示,其中圖6-12(d)就是最後生成的哈夫曼樹,它的帶權路徑長度為37,由此可知,圖6-11(c)是由所給的4個帶權葉子結點生成的一棵哈夫曼樹。

在構造哈夫曼樹的過程中,每次由兩棵權值最小的樹生成一棵新樹時,新樹的左子樹和右子樹可以任意安排,這樣將會得到具有不同結構的多個哈夫曼樹,但它們都具有相同的帶權路徑長度。為了使得到的哈夫曼樹的結構盡量唯一,通常規定生成的哈夫曼樹中每個結點的左子樹根結點的權小於等於右子樹根結點的權。上述哈夫曼樹的構造過程就是遵照這一規定進行的。

(2)構造哈夫曼樹的演算法描述

根據上述構造哈夫曼樹的過程可以寫出相應的用c語言描述的演算法,具體如下:

構造哈夫曼樹演算法

struct btreenode* createhuffman(int a, int n) /*根據陣列a中n個權值建立一棵哈夫曼樹,返回樹根指標*/ /*進行n-1次迴圈建立哈夫曼樹*/ for(i=1; idatadata)  else if(b[j]->datadata) k2=j; } } /*由最小權值樹和次最小權值樹建立一棵新樹,q指向樹根結點*/ q=malloc(sizeof(struct btreenode)); q->data=b[k1]->data+b[k2]->data; q->left=b[k1]; q->right=b[k2]; /*將指向新樹的指標賦給b指標陣列中k1位置,k2位置置為空*/ b[k1]=q; b[k2]=null; } /*刪除動態建立的陣列b*/ free(b); /*返回整個哈夫曼樹的樹根指標*/ return q;}
在這個演算法中有多處動態分配儲存空間,按正常情況需要判斷分配是否成功,這裡為簡便起見而省略了。不過,由於計算機作業系統的功能越來越強,即使記憶體無動態分配的空間可用,系統也會自動到外存尋找空間並進行有效分配,所以通常沒有必要判斷動態分配是否有效。萬一分配失敗,也不會造成機器故障,系統會自動退出程式執行。

(3)求哈夫曼樹的帶權路徑長度的演算法描述

下面給出求哈夫曼樹帶權路徑長度的演算法。

求哈夫曼樹的帶權路徑長度的演算法

int weightpathlength(struct btreenode* fbt, int len) /*根據fbt指標所指向的哈夫曼樹求出帶權路徑長度,len初值為0*/ /*訪問到非葉子結點時進行遞迴呼叫,返回左、右子樹的帶權路徑長度之和,向下深入一層時len值增1*/ else  }}

資料結構 樹 C語言 堆

include include typedef struct heapstruct pheap pheap為結構指標,指向這個結構 struct heapstruct typedef pheap maxheap typedef pheap minheap define maxdata 1000 de...

資料結構 C語言 之樹

所謂二叉樹就是只具有0,1,2三種度的一顆樹 前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。若二叉樹為空則結束返回,否則 1 訪問根結點。2 前序遍歷左子樹。3 前序遍歷右子樹 需要注意的是 遍歷左右子樹時仍然採用前序遍歷...

C語言 資料結構

指標一維陣列 指標陣列 陣列指標 malloc函式 字元陣列 結構體聯合體 報錯問題 亂碼了,阿肆的github,這裡顯示正常,都是傳的md檔案。include include int main void ide根據檔案字尾選擇編譯器,cpp呼叫c 編譯器 c程式進行編譯是以源程式檔案為物件進行的,...