配合優先佇列來實現哈夫曼樹

2021-09-28 16:50:59 字數 3530 閱讀 1005

#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...