哈夫曼樹的定義:
//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年提出,這種樹在資訊檢索中很有用。結點之間的路徑長度 從乙個結點到另乙個結點之間的分支數目。樹的路徑長度 從樹的根到樹中每乙個結點的路徑長度之和。結點的帶權路徑長度 從該結點到樹根之間的路徑...