锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
unsigned int weight; /* 鏉冨?nbsp;*/
unsigned int parent; /* 鐖惰妭鐐圭儲寮?nbsp;*/
unsigned int lchild; /* 宸﹀瀛愮儲寮?nbsp;*/
unsigned int rchild; /* 鍙沖瀛愮儲寮?nbsp;*/
} HTNode, *HuffmanTree; /* 鍔ㄦ佸垎閰嶆暟緇勫瓨鍌ㄥ搱澶浖鏍?nbsp;*/
typedef char **HuffmanCode; /* 鍔ㄦ佸垎閰嶆暟緇勫瓨鍌ㄥ搱澶浖緙栫爜琛?nbsp;*/
/* 浠巋t鐨?锝瀗鐨勮妭鐐逛腑鎵懼嚭鏉冨兼渶灝忕殑涓や釜鑺傜偣錛屽垎鍒瓨浜巗1, s2涓?nbsp;*/
void Select(HuffmanTree ht, int n, int *s1, int *s2)
{
int i;
*s1 = 0;
*s2 = 0;
/*璁劇疆s1, s2鍒板紑濮嬩袱涓猵arent絳変簬0鐨勮妭鐐逛綅緗?/span>*/
for (i = 1; i <= n; ++i) {
if (*s1 != 0 && *s2 != 0)
break;
if (ht[i].parent == 0)
*s1 == 0 ? *s1 = i : *s2 = i;
}
/*鎵懼嚭ht涓璸arent絳変簬0錛屼笖鏉冨兼渶灝忕殑涓や釜鑺傜偣浣嶇疆錛屽垎鍒瓨浜巗1, s2涓?/span>*/
for ( ; i <= n; ++i) {
if (ht[i].parent != 0) continue;
if ( (ht[*s1].weight > ht[*s2].weight) && (ht[*s1].weight > ht[i].weight))
*s1 = i;
else if ( (ht[*s2].weight > ht[*s1].weight) && (ht[*s2].weight > ht[i].weight))
*s2 = i;
}
}
/* 閫氳繃w瀛樺偍鐨刵涓潈鍊鹼紝鏉ュ垱寤轟竴棰楀搱澶浖鏍? ht_ptr鎸囧悜榪欓鍝堝か鏇兼爲(wèi) */
void CreateHuffmanTree(HuffmanTree *ht_ptr, int *w, int n)
{
int m;
int i;
int s1, s2;
HuffmanTree p;
if (n <= 1) return;
m = 2 * n - 1; /* n涓瓧絎︼紝闇瑕?n-1涓┖闂存潵瀛樺偍鏁撮huffman tree */
*ht_ptr = (HuffmanTree)malloc( (m + 1) * sizeof(HTNode)); /* 0鍙峰崟鍏冧笉鐢?nbsp;*/
for (p = *ht_ptr + 1, i = 1; i <= n; ++i, ++p, ++w) { /* 鍒濆鍖栨暟緇勪腑鍓峮涓崟鍏冨瓨鍌ㄧ殑瀛楃 */
p->weight = *w;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
}
for ( ; i <= m; ++i, ++p) { /* 鍒濆鍖栨暟緇勪腑鍓╀綑鐨勫崟鍏?nbsp;*/
p->weight = 0;
p->parent = 0;
p->lchild = 0;
p->rchild = 0;
}
for (i = n + 1; i <= m; ++i) {
Select(*ht_ptr, i - 1, &s1, &s2);
/* 璁劇疆s1, s2鐨勭埗浜蹭負(fù)i */
(*ht_ptr + s1)->parent = i;
(*ht_ptr + s2)->parent = i;
/* 璁劇疆i鐨勫乏瀛╁瓙涓簊1, 鍙沖瀛愪負(fù)s2 */
(*ht_ptr + i)->lchild = s1;
(*ht_ptr + i)->rchild = s2;
/* 璁劇疆i鐨勬潈鍊間負(fù)s1, s2涔嬪拰 */
(*ht_ptr + i)->weight = (*ht_ptr + s1)->weight + (*ht_ptr + s2)->weight;
}
}
/* 瀵筯t_ptr瀛樺偍鐨勫搱澶浖鏍?wèi)鐨刵涓彾瀛愯妭鐐硅繘琛屽搱澶浖緙栫爜 */
void HuffmanCoding(HuffmanTree *ht_ptr, HuffmanCode *hc_ptr, int n)
{
int i;
int start;
char *cd = NULL;
*hc_ptr = (HuffmanCode)malloc( (n + 1) * sizeof(char *));
cd = (char *)malloc(n * sizeof(char));
cd[n - 1] = '\0';
for (i = 1; i <= n; ++i) {
start = n - 1;
int current, father;
for (current = i, father = (*ht_ptr + i)->parent; /* 浠庡彾瀛愯妭鐐瑰紑濮嬶紝騫跺彇寰楃埗鑺傜偣father */
father != 0; /* 鐖惰妭鐐逛負(fù)0鏃跺強(qiáng)鍒拌揪浜嗘牴鑺傜偣 */
current = father, father = (*ht_ptr + father)->parent) { /* 閫愭笎鍚戞牴鑺傜偣闈犳嫝 */
if ( (*ht_ptr + father)->lchild == current) /* 褰撳墠鑺傜偣涓哄乏瀛╁瓙 */
cd[--start] = '0';
else
cd[--start] = '1';
}
*(*hc_ptr + i) = (char *)malloc( (n - start) * sizeof(char));
strcpy(*(*hc_ptr +i), &cd[start]);
}
free(cd);
}
]]>
typedef struct _BiTNode {
char data;
struct _BiTNode *lchild;
struct _BiTNode *rchild;
} BiTNode, *BiTree;
/*鍒涘緩浜屽弶鏍?/span>*/
STATUS CreateBiTree(BiTree *T)
{/*鎸夊厛搴忔搴忚緭鍏ヤ簩鍙夋爲(wèi)鑺傜偣鐨勫鹼紝絀烘牸琛ㄧず絀烘爲(wèi)銆?/span>*/
char ch;
scanf("%c", &ch);
if (ch == ' ') {
*T = NULL;
} else {
if ( !(*T = (BiTNode *)malloc(sizeof(BiTNode)))) exit(-1);
(*T)->data = ch; //鐢熸垚鏍硅妭鐐?/span>
CreateBiTree(&((*T)->lchild)); //鏋勯犲乏瀛愭爲(wèi)
CreateBiTree(&((*T)->rchild)); //鏋勯犲彸瀛愭爲(wèi)
}
return OK;
}
/*涓簭閬嶅巻浜屽弶鏍?/span>*/
STATUS InOrderTraverse(BiTree *T)
{
if (*T) {
if (InOrderTraverse(&((*T)->lchild)))
printf("%c ", (*T)->data);
if (InOrderTraverse(&((*T)->rchild)))
return OK;
return ERROR;
} else {
return OK;
}
}
]]>