// question.cpp : 此檔案包含 "main" 函式。程式執行將在此處開始並結束。
//#include "stdio.h"
#include "stdlib.h"
#define stringsize 30//輸入最大字串的大小
struct bitreenode//構造二叉樹結構體
;struct codestack//順序棧用來存哈弗曼編碼
;void push(codestack *&code, int path)//入棧,存入哈夫曼**,path為哈弗曼編碼值
void huffmancode(bitreenode *p, codestack *code)//p為每乙個節點,code是乙個棧,用來存哈弗曼編碼
if (p->sign != '#')//讀到了葉子結點
putchar('\n');//換行準備輸出下一組哈弗曼編碼
} huffmancode(p->l, code);//左子樹深度搜尋
code->top = p->path;//這裡為訪問頭結點的位置,當做再次訪問此結點。
//將top重置為當前層數(path儲存的當前層數)
huffmancode(p->r, code);//右子樹遞迴 }}
void renewarray(char a, int address)//刪除相同字元,重新生成字串
a[address] = '\0';//最後一項為空,使得size減小1
}void sortarray(bitreenode *data, int k)//哈夫曼陣列根據權值大小排序
}void deletearray(bitreenode *data, int* boundary)//刪除陣列中最小的兩個元素
*boundary = i - 2;//實際上多了乙個,用來存放新構成的樹
}void initiatestack(codestack *&code)//初始化棧
void countpower(char store, bitreenode *data, int* boundary)//統計字串中各字元的權值
//data為最終要獲取的原始陣列
else//如果不相等便搜尋下乙個位置
i++;
} data[k]->sign = flag;
data[k]->power = j;
k++;//指向哈夫曼陣列的下乙個單元
j = 0;//權值歸零用來統計下乙個字元的權值
} *boundary = k;
}void initiatestruct(bitreenode *data)//初始化哈夫曼原始陣列
}void initiatetree(bitreenode *data, bitreenode **s, int* boundary)
else
(*s)->power = data[0]->power + data[1]->power;//頭結點的權值是兩個子樹權值之和
(*s)->sign = '#';//頭結點的符號為「#」
(*s)->path = -1;//根結點的路徑預設為-1
deletearray(data, boundary);//刪除陣列中最小的兩個元素
data[*boundary] = (*s);//陣列末尾存放新生成的樹
if (*boundary < 0)//如果只剩下一棵樹就不用排序
break;
else
sortarray(data, *boundary + 1);//哈夫曼陣列根據權值大小排序 }}
void operatemode(char store, bitreenode *data, int *boundary)
case 2:
*boundary = i;
system("cls");
break;
} }}void main()
哈夫曼編碼實現
define huffmancode char typedef struct node huffmantree struct node 葉節點為n的哈夫曼樹有2 n 1個節點 用 1表示當前parent未被訪問 huffmantree createhuffmantree int wet,int n ...
實現哈夫曼編碼
include include include include include using namespace std typedef struct node vector nodes 表示結點的指標組 double char number 0 每個字元平均花費的編碼長度 const int cha...
哈夫曼編碼 哈夫曼樹
1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....