資料結構 C語言實現構建哈夫曼樹

2021-07-04 21:59:57 字數 1328 閱讀 8410

哈夫曼樹(霍夫曼樹)又稱為最優樹.

1、路徑和路徑長度

在一棵樹中,從乙個結點往下可以達到的孩子或孫子結點之間的通路,稱為路徑。通路中分支的數目稱為路徑長度。若規定根結點的層數為1,則從根結點到第l層結點的路徑長度為l-1。

2、結點的權及帶權路徑長度

若將樹中結點賦給乙個有著某種含義的數值,則這個數值稱為該結點的權。結點的帶權路徑長度為:從根結點到該結點之間的路徑長度與該結點的權的乘積。

3、樹的帶權路徑長度

樹的帶權路徑長度規定為所有葉子結點的帶權路徑長度之和,記為wpl

#include 

#include

#include

/* 哈夫曼樹的結構體 */

typedef struct sthunode

hunode;

/** 找出權值陣列裡面,最小的兩個權值下標

* 函式請參:hunode *parray 存放節點的指標陣列

int n 陣列裡面的元素個數

int* p1 存放最小權值的下標

int* p2 存放第二小權值的下標

*/int findsmalldata(hunode *parray ,int n,int* p1, int* p2)

for(index = 0; index

< n; index++)

else

if(parray[index]->data < sec_small)

}

}return0;}

/** 函式功能:構建哈夫曼樹

* 函式請參:int* a 權值陣列

int n 這個陣列裡面有多少個資料

*/hunode* createhutree(int* a, int n)

/* 構建哈夫曼樹 */

for(index = 0; index

< n-1; index++)

return pnewnode;

}/* 前序遍歷該二叉樹 */

void preorderhuffman(hunode* root)

}int main()

; hunode* root = null;

/* 構建哈夫曼樹 */

root = createhutree(a,4);

/* 前序遍歷 */

preorderhuffman(root);

printf("\n");

return

0;}

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語言實現哈夫曼樹

ddl是第一生產力,公理 哈夫曼樹又稱最優二叉樹。它是 n 個帶權葉子結點構成的所有二叉樹中,帶權路徑長度 wpl 最小的二叉樹。就是構造乙個哈夫曼樹,然後輸出最小帶權路徑 wpl 大致思路 每個結點自成一棵樹,成森林 選擇所有樹的根結點 不為null 中權值最小的兩個,合併,新malloc乙個節點...

哈夫曼樹 (c語言)資料結構

include include include define n 100 typedef struct hfmshfmsnode typedef char hfmscode 動態分配陣列儲存哈夫曼編碼 定義結構體型別 void select hfmsnode ht,int len int s1,in...