#pragma once
#ifndef _haffu_h_
#define _haffu_h_
#define haffu typedef
haffu char type_char; // 哈夫曼樹結點的值域之一為 char 型別 表示出現的字元
haffu int type_wight; // 哈夫曼樹結點的值域之一為 int 型別 表示出現的字元的權重
haffu int node_number; // 哈夫曼樹的結點總數
#include template using stack = std::stack;
haffu struct haffu_chaffunode, *haffunodep;
// 先序遍歷
void
preorder(haffunodep haffu_tree);
// 中序
void
cenorder(haffunodep haffu_tree);
// 得到哈夫曼樹的 所有結點數量
node_number
gethaffunodenumber(haffunodep haffu_tree);
// 得到哈夫曼樹的所有葉子結點 返回的是所有的葉子結點的陣列
type_char*
gethaffuleaf(haffunodep haffu_tree, int maxlen);
// 求哈夫曼編碼 返回的是該葉子結點的哈夫曼編碼的陣列 0 1(二進位制) 形式
void
gethaffucoding(haffunodep haffu_tree, type_char leaf, type_char*, int& index);
// 樹的銷毀
void
destroytree(haffunodep &haffu_tree);
#endif // !_haffu_h_
#include #include "haffu_tree.h"
#include void
preorder(haffunodep haffu_tree)
void
cenorder(haffunodep haffu_tree)
void
destroytree(haffunodep &haffu_tree)
out++;
}for (int i = out - 1; i > -1; i--)
return;
}node_number
gethaffunodenumber(haffunodep haffu_tree)
type_char*
gethaffuleaf(haffunodep haffu_tree, int maxlen)
stack.pop();
if (tmp->rchild)stack.push(tmp->rchild);
if (tmp->lchild)stack.push(tmp->lchild);
}return leaf;
}
#include #include #include #include "priority_queue.h"
#include //*
#include //*
#ifdef _debug //*
#ifndef dbg_new //*
#define dbg_new new (_normal_block, __file__, __line__)//*
#define new dbg_new //*
#endif //*
#endif
using namespace std;
int main(void)
else
srand((unsigned)time(nullptr));
// 插入
if (debug)cout << "******************入隊********************" << endl;
elem_type* node;
for (int i = 0; i < 10; i++)
else
}if (debug) printqueue(pq);
cout << endl;
// 優先佇列的出隊
if (debug)cout << "******************出隊********************" << endl;
elem_type* out_node = nullptr;
for (int i = 0; i < 3; i++)
else
}// 遍歷
if (debug) printqueue(pq);
cout << endl;
// 構建哈夫曼樹
haffunodep haffu_tree = nullptr;
buildhaffu(pq, haffu_tree);
// 先序遍歷
if (debug) cout << "哈夫曼樹的先序遍歷:" << endl;
preorder(haffu_tree);
cout << endl;
// 中序遍歷
if (debug) cout << "哈夫曼樹的中序遍歷:" << endl;
cenorder(haffu_tree);
cout << endl;
// 得到樹的結點總數
int maxlen = gethaffunodenumber(haffu_tree);
if (debug) cout << "哈夫曼樹的結點總數:" << maxlen << endl;
// 得到樹的葉子陣列
if (debug) cout << "哈夫曼樹的葉子結點總數:" << endl;
type_char* leaf_str = gethaffuleaf(haffu_tree, maxlen);
int reallenth = strlen(leaf_str);
for (int i = 0; i < reallenth; i++)
cout << endl;
delete leaf_str;
destroytree(haffu_tree);
destroyqueue(pq);
if (debug) cout << "哈夫曼樹 和 佇列 銷毀成功!" << endl;
end = clock();
cout << start << " ";
cout << end << endl;
printf("總共用了 %d 個系統時間 \n", int(end - start));
system("pause");
_crtdumpmemoryleaks();
return 0;
}
優先佇列 哈夫曼樹
哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和的最小值。輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出權值。示例1 ...
哈夫曼樹(佇列實現)
題意 分析 哈夫曼樹 給定n個權值作為n個葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小,稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。對於一顆哈夫曼樹,我們把所有節點排序,權值大的必定層數較低,f i j 代表已經放...
優先佇列實現 哈夫曼編碼
用到了優先佇列的知識點,還有dfs演算法。優先佇列主要是為了查詢最小權重樹的時候方便查詢,不用耗費很多的時間從已經產生的樹種依次查詢,具體實現看 dfs主要是用來遍歷樹從而拿到每個字元的編碼,具體實現看 include include include includeusing namespace s...