哈夫曼樹及哈夫曼編碼 C

2021-07-09 06:44:21 字數 2328 閱讀 7995

/*

**說明:

1.讀取檔案中需進行哈夫曼編碼的資料資訊

2.構造生成單節點二叉樹組 -> 森林

3.構造哈夫曼樹

4.進行哈夫曼編碼

5.輸出對應資料及其編碼

*/#include#include#includeusing namespace std;

const int max_n = 100;//最大容量

const int inf = 65535;//定義為無窮大

//哈夫曼樹節點

class hnode

;//哈夫曼編碼節點

class huffcode

;class huffman

~huffman(){}

// 函式名:createforest

// 返回值型別:void

// 引數:string filename

// 功能:

// 1.讀取檔案中資料資訊

// 2.構建單節點二叉樹組成的森林

// void createforest(string filename)

//end for -> data for code

snum = (int)str.length();//被編碼資料數量

//讀取被編碼資料出現頻率

i = 0;

while (!readfile.eof())

//end if -> judge input

}//end while -> file eof

readfile.close();

} // 函式名:createhuffmantree

// 返回值型別:void

// 引數:null

// 功能:利用森林構建哈夫曼樹

// void createhuffmantree()

//end for -> init result

for (int j = snum; j < 2 * snum - 1; j++)

//end if -> less

//不小於最小,小於次小

else if (ht[k].weight < min2)

//end else if -> only bigger than min1

//no else

}//end if -> search

}ht[j].weight = ht[lnode].weight + ht[rnode].weight;//雙親結點權重

ht[j].lchild = lnode;//雙親節點左孩子

ht[j].rchild = rnode;

ht[lnode].parent = j;//原最小頻率值所在節點的雙親節點賦值為當前節點j

ht[rnode].parent = j;

ht[j].parent = -1;//雙親節點參與比較,賦值為-1

} }// 函式名:createhuffcode

// 返回值型別:bool -> 判斷是否編碼成功,成功返回true,否則false

// 功能:生成哈夫曼編碼

// bool createhuffcode()

//end if -> left node

else

//end else -> right node

c = f;//替換為上一層節點

f = ht[f].parent;//上一層的雙親節點

}//end while

hc.huffinfo++;

hcode[i] = hc;//賦值當前編碼

hc.code.clear();//清空code內容,進行下一次訪問

}//end for

return true;

} // 函式名:display

// 返回值型別:void

// 引數:null

// 功能:輸出哈夫曼樹編碼

// void display()

//end for

}private:

hnode ht[max_n];//哈夫曼樹

huffcode hcode[max_n];//編碼

int snum;//總結點數

};int main()

//end if -> create huffman tree's code

huff.display();//輸出編碼

return 0;

}

測試結果:

哈夫曼樹及哈夫曼編碼

哈夫曼樹,最優二叉樹,帶權路徑長度 wpl 最短的樹。它沒有度為1的點,是一棵嚴格的二叉樹 滿二叉樹 了解哈夫曼樹,我們首先要知道樹的幾個相關術語,並了解什麼是wpl。注 樹的wpl這個概念非常重要,這個公式直接產生了哈夫曼編碼資料壓縮的應用 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹...

哈夫曼樹及哈夫曼編碼

給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。樹節點間的邊相關的數叫做權。從樹中的乙個節點到另乙個節點之間的分支構成兩個點之間的路徑,路徑上的分支數目...

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....