C語言實現哈夫曼樹

2021-10-10 23:20:14 字數 1471 閱讀 4727

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中選取根結點的權值最小和次小的兩棵二叉樹作為左,右子樹構造一棵新的二叉樹,這棵...