資料結構 哈夫曼樹與編碼

2021-08-03 01:59:18 字數 1887 閱讀 1623

哈夫曼樹的定義:

//1、輸出二叉樹,可在前序遍歷的基礎上修改。採用廣義**式,元素型別為int

void printbtree_int(struct btreenode* bt)

} }

//2、根據陣列 a 中 n 個權值建立一棵哈夫曼樹,返回樹根指標

struct btreenode* createhuffman(elemtype a, int n)

for (i = 1; i < n; i++)//進行 n-1 次迴圈建立哈夫曼樹

if (b[j] != null)

} for (j = k2; j < n; j++)//從當前森林中求出最小權值樹和次最小

else if (b[j]->data < b[k2]->data)

k2 = j;

} }

//由最小權值樹和次最小權值樹建立一棵新樹,q指向樹根結點

q = (btreenode *)malloc(sizeof(struct btreenode));

q->data = b[k1]->data + b[k2]->data;

q->left = b[k1];

q->right = b[k2];

b[k1] = q;//將指向新樹的指標賦給b指標陣列中k1位置

b[k2] = null;//k2位置為空

} free(b); //刪除動態建立的陣列b

return q; //返回整個哈夫曼樹的樹根指標

}

//3、求哈夫曼樹的帶權路徑長度

elemtype weightpathlength(struct btreenode* fbt, int len)//len初始為0

} //4、哈夫曼編碼(可以根據哈夫曼樹帶權路徑長度的演算法基礎上進行修改)

void huffmancoding(struct btreenode* fbt, int len)//len初始值為0

else//訪問到非葉子結點時分別向左右子樹遞迴呼叫,並把分支上的0、1編碼儲存到陣列a

} }

//主函式

int main()

a =(elemtype *) malloc(n*sizeof(elemtype));

printf("從鍵盤輸入%d個整數作為權值:", n);

for (i = 0; i < n; i++)

scanf(" %d", &a[i]);

fbt = createhuffman(a, n);

printf("廣義表形式的哈夫曼樹:");

printbtree_int(fbt);

printf("\n");

printf("哈夫曼樹的帶權路徑長度:");

printf("%d\n", weightpathlength(fbt, 0));

printf("樹中每個葉子結點的哈夫曼編碼:\n");

資料結構 哈夫曼樹與哈夫曼編碼

1 路徑 由乙個結點到另乙個結點之間的所有分支共同構成。2 路徑長度 結點之間的分支數目。3 樹的路徑長度 從樹的根結點到其他所有結點的路徑長度之和。4 權 賦予某一實體的值。在資料結構中,實體包括結點和邊,所以對應有結點權和邊權。5 結點的帶權路徑長度 結點與樹的根結點之間的路徑長度與結點權的乘積...

資料結構 哈夫曼樹與哈夫曼編碼

include pch.h include 哈夫曼樹類huffmantree的定義 huffman樹結點類treenode宣告 template class t class huffmannode 建構函式 huffmannode getleft void const void setleft hu...

資料結構 哈夫曼樹 哈夫曼編碼

哈夫曼樹又稱最優樹 二叉樹 是一類帶權路徑最短的樹。構造這種樹的演算法最早是由哈夫曼 huffman 1952年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...