哈夫曼樹及WPL計算的一種實現

2021-10-08 09:27:22 字數 2841 閱讀 2393

主要思路寫在注釋裡了,用了兩個陣列,乙個作為堆,乙個作為儲存最後樹狀結構位址的陣列。我自己感覺可能有點複雜了,下次可以試試用結構體而不是二維陣列來實現同樣的功能。

(使用code::block 17.12編譯)

#include

#include

typedef

struct haffmantreehaff;

typedef

struct haffheaphaffheap;

//思路:兩個陣列,乙個是包含所給數的最小堆haffheap[0](void*),乙個是包含訪問過的樹的陣列haffheap[1](void*),陣列裡面的元素都是haff

//capacity是陣列容量(固定)

//入堆:haffheap[0]中增加乙個元素,值是出堆兩個元素之和,並附有左右兒子的指標

haff*

outheap

(haffheap*

* h)if(

(h[0

]->pdata[i]

.data)

>

(h[0

]->pdata[

2*i]

.data)

) temp=h[0]

->pdata[i]

; h[0]

->pdata[i]

=h[0

]->pdata[

2*i]

; h[0]

->pdata[

2*i]

=temp;

}else

i=i*2;

}return

&h[1

]->pdata[h[1]

->capacity-1]

;}///建立乙個哈夫曼樹

haff*

buildhafftree

(haffheap*

* h)

return

&h[0

]->pdata[1]

;}///建立兩個二維哈夫曼陣列(haffheap[0] haffheap[1]),並返回

haffheap*

*createhaffheap

(int capacity)

newhaffheap[0]

->capacity=capacity;

//哈夫曼堆: newhaffheap[0](haffheap*)

newhaffheap[1]

->capacity=0;

//哈夫曼陣列:newhaffheap[0](haffheap*)

//建立乙個無序的新堆

printf

("請依次輸入%d個數以組成哈夫曼樹\n"

,capacity)

;while

((c=

getchar()

)!=eof)

n=n*i+c-

'0';

i=10;

}//給無序的新堆排序

i=newhaffheap[0]

->capacity/2;

for(

;i>

0;i--

)//output(newhaffheap[0]);

return newhaffheap;

}///帶數建立堆時用到的函式「下沉」

//如果節點比左右兒子都大,把節點和其左右子節點中較小的那個交換。。。直到為空

void

sink

(haffheap* h,

int n)

elseif(

2*n==h->capacity)

}elseif(

2*ncapacity)

}else

if(h->pdata[

2*n]

.data>h->pdata[

2*n+1]

.data)}}

}///以完全二叉樹的形式輸出動態陣列

void

output

(haffheap* h)

} i=1;

printf

("\n\n");

limt=limt*2;

}printf

("\n");

}///輸出陣列

void

outputarray

(haffheap* h)

printf

("\n");

}///乙個哈夫曼樹的先序遍歷

void

prereadhaff

(haff* r)

printf

("%d\n"

,r->data)

;prereadhaff

(r->left)

;prereadhaff

(r->right);}

///入堆:haffheap[0]中增加乙個元素並排序

void

enterheap

(haff* newhaff,haffheap*

* h)

}///求wpl路徑長度

//思路:wpl=σ深度*樹值

intwpl

(haff* htree,

int depth)

int wpl1=

wpl(htree->left,depth)

;int wpl2=

wpl(htree->right,depth)

;//printf("wpl=%d\n",wpl1+wpl2);

return wpl1+wpl2;

}int

main()

哈夫曼樹 計算最小WPL

哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出權值。示例1 複製5 ...

搬水果 計算哈夫曼樹最小WPL

在乙個果園裡,小明已經將所有的水果打了下來,並按水果的不同種類分成了若干堆,小明決定把所有的水果合成一堆。每一次合併,小明可以把兩堆水果合併到一起,消耗的體力等於兩堆水果的重量之和。當然經過 n 1 次合併之後,就變成一堆了。小明在合併水果時總共消耗的體力等於每次合併所耗體力之和。假定每個水果重量都...

C 哈夫曼樹及哈夫曼編碼的實現

huffmancode.h ifndef huffmancode h define huffmancode h include typedef struct htnode,huffmantree typedef char huffmancode void huffmancoding huffmant...