雖然東西簡單了點,可能還有錯,讀者們別介意它太囉嗦,有更好的建議歡迎交流的。放出來希望對像我一樣學習程式設計的人有幫助(雖然看別人的**貌似是件很痛苦的事啊)。
這裡沒有用模板函式(人比較懶),,節點的權值都是int,,類函式定義都在類的內部
//哈夫曼樹類
class node;};
class huffmantree
huffmantree()
void build_tree(int pro,char cha,int count)
for(int j=0;jroot->weight>r[i]->root->weight)
}for(int i=j+2;iroot->weight>r[i]->root->weight)
}huffmantree *t_r=new huffmantree(); //過渡用的t_r 生成新的樹賦給r[j+1]
t_r->root->lchild=r[j]->root;
r[j]->root->parent=t_r->root;
r[j]->root->node_code='0'; //是parent的左孩子,賦予路徑0
t_r->root->rchild=r[j+1]->root;
r[j+1]->root->parent=t_r->root;
r[j+1]->root->node_code='1'; //是parent的左孩子,賦予路徑1
t_r->root->weight = r[j]->root->weight+r[j+1]->root->weight; //左右孩子的權值和
r[j+1]=t_r;
if(j+1==count-1)
root=r[j+1]->root;
} }void turn_char_code(node *h) //輸出每個字元的編碼
leaf_code.push_back(s);
coutif(h->rchild!=null)
}string turn_string_code(string src) //返回字串的哈夫曼編碼
} //計算src中各字元的出現次數 相對應記錄於p
for(int j=0;j<=c_count;j++)
;};class huffmantree
huffmantree()
void build_tree(int pro,char cha,int count)
for(int j=0;j
}for(int i=j+2;i
}huffmantree *t_r=new huffmantree(); //過渡用的t_r 生成新的樹賦給r[j+1]
t_r->root->lchild=r[j]->root;
r[j]->root->parent=t_r->root;
r[j]->root->node_code='0'; //是parent的左孩子,賦予路徑0
t_r->root->rchild=r[j+1]->root;
r[j+1]->root->parent=t_r->root;
r[j+1]->root->node_code='1'; //是parent的左孩子,賦予路徑1
t_r->root->weight = r[j]->root->weight+r[j+1]->root->weight; //左右孩子的權值和
r[j+1]=t_r;
if(j+1==count-1)
root=r[j+1]->root;}}
void turn_char_code(node *h) //輸出每個字元的編碼
leaf_code.push_back(s);
cout<}
if(h->lchild!=null)
if(h->rchild!=null)
}string turn_string_code(string src) //返回字串的哈夫曼編碼
}return h_string;
}string decode(string src)}}
return s;}};
string huffmancoding(const string &src)
}if(k>0) //在c中未找到當前字元
} //計算src中各字元的出現次數 相對應記錄於p
for(int j=0;j<=c_count;j++)
}huffmantree h_tree;
h_tree.build_tree(p,c,c_count);
cout << "***** code for each char :" << endl;
destcode=h_tree.turn_string_code(src);
cout << "coded string : " << destcode << endl;
string destdecode;
/// 此處輸出每個字元的編碼
/// 在此處新增解碼**,輸入為destcode,輸出為destdecode
destdecode=h_tree.decode(destcode);
cout << "decoded string : " << destdecode << endl;
return destdecode;
}
Huffman樹與Huffman編碼
一.哈夫曼樹概念 路徑 祖先到節點之間的分支構成一條通往節點的路徑 路徑長度 路徑上分支的數目稱為路徑長度 節點的權 給樹中節點所設的物理意義的值 節點帶權路徑長度 從根到該點路徑長度與該點權值的乘機 huffman樹就是所有樹中每點帶權路徑加和最短的樹。二.huffman樹構造步驟 1.根據每個點...
Huffman樹與Huffman編碼
huffman tree簡介 赫夫曼樹 huffman tree 又稱最優二叉樹,是一類帶權路徑長度最短的樹。假設有n個權值,如果構造一棵有n個葉子節點的二叉樹,而這n個葉子節點的權值是,則所構造出的帶權路徑長度最小的二叉樹就被稱為赫夫曼樹。這裡補充下樹的帶權路徑長度的概念。樹的帶權路徑長度指樹中所...
huffman樹和huffman編碼
huffman樹和huffman編碼 include include include include define overflow 1 typedef struct htnode,huffmantree typedef char huffmancode void select huffmantre...