一
昨天寫了個哈夫曼樹,其實難到不難,重點是利用標準庫里的優先佇列就很好辦了
哈夫曼樹主要是建立個最小堆,求最小加權路徑,就是求哈夫曼樹中非葉子結點的權值和
#include
priority_queueq 這個是最大堆
最小堆這樣寫:priority_queue, greater> q 另外,用vs2012寫的時候總是不能過,是因為還需要加乙個標頭檔案,#include
二重點說說二叉樹,
可根據包括中序遍歷的兩個遍歷確定一棵樹
寫程式時需注意給節點申請空間什麼的,主要是我對指標什麼的還是理解的不太透徹,所以還是需要注意一下
貼個**:根據前序和中序確定後序
#include#include#include#include#include#includeusing namespace std;
struct nodetree[50];
int cnt;//代表樹的節點個數
node* create()
char str1[30];
char str2[30];
node* build(int s1,int e1,int s2, int e2)
} if(rootidx!=s2)
if(rootidx!=e2)
return res;//返回根節點指標
}void postorder(node* t)
int main()tree[100];
int loc;
node *create()
node* insert(node* t,int x)
else
return t;
}char str1[25];
char str2[25];
int size1,size2;
char* str;//當前正在儲存的字串
int* size;//當前正在儲存的字串的個數
void preorder(node* t)
void inorder(node* t)
int main(){
int n;
char tmp[12];
while(cin>>n&&n!=0){
cin>>tmp;
loc=0;
node* t=null;
for(int i=0;tmp[i]!='\0';i++)
t=insert(t,tmp[i]-'0');
size1=0;//初始化為0
str=str1;//將str的首位址指向str1的首位址所指向的地方
size=&size1;
preorder(t);
inorder(t);
str1[size1]='\0';
// cout<>tmp;
node* t2=null;
for(int i=0;tmp[i]!='\0';i++)
t2=insert(t2,tmp[i]-'0');
size2=0;//初始化為0
str=str2;//將str的首位址指向str2的首位址所指向的地方
size=&size2;
preorder(t2);
inorder(t2);
str2[size2]='\0';
if(strcmp(str1,str2)==0)
cout<<"yes"<
哈夫曼樹(最優二叉樹)
給定n個權值作為n的 葉子結點,構造一棵二叉樹,若帶權路徑長度達到最小 所謂樹的帶權路徑長度,就是樹中所有的葉結點 的權值乘上其到根結點的路徑長度 稱這樣的二叉樹為最優二叉樹,也稱為哈夫曼樹 huffman tree 哈夫曼樹是帶權路徑長度最短的樹,權值較大的結點離根較近。假設有n個權值,則構造出的...
二叉樹與哈夫曼樹
1,二叉樹 二叉樹可以分為 完全二叉樹,滿二叉樹,哈夫曼樹 二叉樹的遍歷 遞迴 先序,中序,後序遍歷 二叉樹的結構 根節點,左子樹,右子樹 二叉樹的性質 1 如果二叉樹的節點個數為n,則父節點的個數為n 2 2 若2i 1 3 若2i 2 二叉樹的構建 構建二叉樹 public void creat...
哈夫曼樹(最優二叉樹)
最優二叉樹 哈夫曼樹 給定n個權值,試構造一棵有n個葉子結點的二叉樹,每個葉子結點帶權為wi。構造出來的二叉樹的形態可以有多個,我們把其中帶權路徑長度wpl最小的二叉樹稱作最優二叉樹或者哈夫曼樹。語言描述 根據給定的n個權值構成n棵二叉樹的集合f 其中每棵二叉樹ti中只有乙個帶權為wi的根結點,其左...