/*
**說明:
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....