很早之前寫的**,今天翻出了整理了半天才找著個行的通的版本,發帖當作筆記了。
備註:只能完成26個小寫字母的編碼,並分別輸出;在選取weight值最小的兩個結點方法中還可引入演算法優化;記憶體控制有待加強。
本**中大量採用指標操作,
2,選取各個子樹中最小weight值得兩棵子樹,假設指標陣列下標分別為max_index,min_index。並以他們的weigh之和(即頻數之和)構造mhtree中新的內結點,具體data以及capacity的設定是為了便於後續輸出相應字元的哈夫曼編碼;
3,使max_index對應的指標指向新生成的內結點,min_index.....指向null;
4,迴圈1.2.3。最終得到mhtree的根節點;
5,按照一定規則遍歷,則可輸出各個字元對應的哈夫曼編碼。
驗證過10組資料,通過。
原始碼如下:
#include#include#includeusing namespace std;
#define maxsize 26
typedef struct node
mhnode,*mhtree;
void findtwominnode(mhtree arr, int& max_index, int& min_index,int& len)
if(max_index != temp)
min_index = temp;
else
cur = temp + 1;
while(cur < len) }
void insertmhnode(mhtree& root, mhtree arr, int len)
root = head;
}void preorder(mhtree root)
preorder(root->lchild);
cout}void printmhcode(const mhtree root)
if(head->data == '#' && head->rchild->capcity != 0)
}--head->capcity;
cout<<" "str;
for(int i = 0; str[i] != '\0'; ++i)
int len = 0;
for(int j = 0; j < 26; ++j) }
if(len == 1)
cout<<"code of manhadun is: "<<0<<" or "<<1<
C 實現哈夫曼編碼
include include include include using namespace std int max 300 class tree tree char a,int n,tree p1,tree p2 vector open 程式設計客棧 中序遍歷輸出各節點及其哈夫曼編碼 void ...
哈夫曼樹與哈夫曼編碼(C 實現)
1 對給定的n個權值構成n棵二叉樹的初始集合f 其中每棵二叉樹ti中只有乙個權值為wi的根結點,它的左右子樹均為空。2 在f中選取兩棵根結點權值最小的樹作為新構造的二叉樹的左右子樹,新二叉樹的根結點的權值為其左右子樹的根結點的權值之和。3 從f中刪除這兩棵樹,並把這棵新的二叉樹同樣以公升序排列加入到...
哈夫曼編碼實現
define huffmancode char typedef struct node huffmantree struct node 葉節點為n的哈夫曼樹有2 n 1個節點 用 1表示當前parent未被訪問 huffmantree createhuffmantree int wet,int n ...