ddl是第一生產力,公理
哈夫曼樹又稱最優二叉樹。它是 n 個帶權葉子結點構成的所有二叉樹中,帶權路徑長度 wpl 最小的二叉樹。
就是構造乙個哈夫曼樹,然後輸出最小帶權路徑(wpl)
大致思路:
每個結點自成一棵樹,成森林
選擇所有樹的根結點(不為null)中權值最小的兩個,合併,新malloc乙個節點,左孩子為最小,右孩子為次小。然後放在左孩子原來的位址上,右孩子置為null
2重複了n-1次之後,此時只剩乙個節點了。這就是構造出來的哈夫曼樹。
這個過程中,設定乙個一直存在的量,記錄路徑長度。
難點:當時不知道怎樣同時找出次小和最小的節點並記錄下來,這個還是閱讀別人的**所了解的,長經驗吧。
自己之前寫的**太長,思路不清晰
還有乙個點一直沒有解決。
printf("%d\n",wpl); free(b);
與free(b);printf("%d\n",wpl);
#include
#include
int w[
100]
, n,wpl =0;
typedef
struct nodehfmnode,hfmtree;
void
createhfmtree
(int
*w,int n)
for(i =
0; i < n -
1; i++)if
(b[j]
!=null)}
for(j = k2; j < n; j++
)else
if(b[j]
->data < b[k2]
->data)
k2 = j;}}
//找出來最小和次最小的節點之後,
p =(hfmnode *
)malloc
(sizeof
(hfmnode*))
; p->data = b[k1]
->data + b[k2]
->data;
wpl +
= p->data;
//求帶權路徑長
p->l = b[k1]
; p->r = b[k2]
; b[k1]
= p;
//新增p這棵樹到b[k1]
b[k2]
=null
;//刪除b[k2]這棵樹
}printf
("%d\n"
,wpl)
;free
(b);
return
;// 可返回整棵樹的根指標
}int
main()
giao,這個**在我們學校oj上竟然一直得分為0,什麼鬼
wocwoc,我把free(b)這個語句去掉,得分100,什麼鬼什麼鬼!!
C語言實現哈夫曼樹
include include typedef struct nodebinode void show binode root if root r null 哈夫曼樹 void a1 權值陣列,為方便直接從小到大有序 int n 6,x,y,z,i,j binode root null binode...
用C語言實現哈夫曼樹
哈夫曼樹c語言實現 include include typedef struct huffmannode huffmannode typedef struct heapnode heapnode 全域性變數 int heapsize 堆大小 int num 記錄字元數量 heapnode heap ...
哈夫曼樹編碼C語言實現
哈夫曼樹編碼c語言實現,實現哈夫曼樹編碼的演算法可分為兩大部分 1 構造哈夫曼樹 2 在哈夫曼樹上求葉結點的編碼 哈夫曼樹構造演算法 1 由給定的n個權值構造n棵只有乙個葉結點的二叉樹,從而得到乙個二叉樹的集合f 2 在f中選取根結點的權值最小和次小的兩棵二叉樹作為左,右子樹構造一棵新的二叉樹,這棵...