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