標籤:樹
今晚感覺好爽啊,好久好久沒有這種感覺,起床需要點爆發力,做事還需要點動力,給自己都沒有下過這麼大的決心寫代碼,幫她卻寫的很好,我自己都吃驚了。哈哈哈。。。今晚也是幫她寫好西郵導航睡不著,那就敲了一下哈夫曼樹轉化成二叉樹的代碼,其實理解了真的不難,我定義F為一個二級指標,用它指向結點的地址,建立很簡單,輸入資料data和權值weight,再把它的左右置為NULL;
初始化話完了,就開始建立二叉樹吧,我定義兩個變數s1和s2,s1永遠標記的是F這個指標數組中節點權值最小的一個,s2則為次小,特別注意,s1和s2我每次初始化的時候都是放在F[i]!=NULL的結點上,這裡用到了我前幾次用的方法,利用for空語句迴圈找到s1和s2,對於如何讓找出s1最小s2次小我已經說過了,就再次不用說了;
這裡面的關鍵幾步應該是如何把二叉樹建立起來,假如說我已經找到小小s1和次小s2了,下面用圖好解釋:
建立出來就是這個樣子了,經過一次建立成為下面這個樣子,
迴圈n-1次之後二叉樹就建立成功了,直接進入代碼;
#include <iostream>#include<stdlib.h>#include<conio.h>#define null NULLtypedef struct HuffNode{char data;int weight;struct HuffNode *left,*right;}HuffNode;HuffNode *CreateHuffman(HuffNode **,int );void preorder(HuffNode * );void leafprint(HuffNode *);void Print(HuffNode *);HuffNode *CreateHuffman(HuffNode **F,int n){ HuffNode *p; int i,j; int k1=0,k2=1; for(i=0;i<n-1;i++){ for(k1=0;k1<n&&F[k1]==null;k1++); //printf("資料%c,權值%d\n",F[k1]->data,F[k1]->weight); for(k2=k1+1;k2<n&&F[k2]==null;k2++); //printf("資料%c,權值%d\n",F[k2]->data,F[k2]->weight); for(j=k2;j<n;j++) { if(F[j]) { if(F[j]->weight<F[k1]->weight){ k2=k1; k1=j; } else if(F[j]->weight<F[k2]->weight&&F[k2]){ k2=j; } } } printf("輸出最小k1=%d k2=%d\n",k1,k2); p=(HuffNode *)malloc(sizeof(HuffNode)); p->weight=F[k1]->weight+F[k2]->weight; p->data='w'; p->left=F[k1]; p->right=F[k2]; F[k1]=p; F[k2]=null; Print(F[k1]); }return F[k1];}void Print(HuffNode *root){if(root){printf("資料%c,權值%d\n",root->data,root->weight);Print(root->left);Print(root->right);}}void leafprint(HuffNode *root){if(root){if(root->left==NULL&&root->right==NULL) printf("資料%c,權值%d\n",root->data,root->weight);leafprint(root->left);leafprint(root->right);}} int main(int argc, char** argv) { HuffNode **F; HuffNode *root; int n,i; printf("請你輸入節點的個數: "); scanf("%d",&n); F=(HuffNode **)malloc(n*sizeof(HuffNode *)); for(i=0;i<n;i++){ fflush(stdin); F[i]=(HuffNode *)malloc(sizeof(HuffNode)); printf("\n輸入第%d個節點的資料,權值: ",i+1); scanf("%c%d",&F[i]->data,&F[i]->weight); F[i]->left=F[i]->right=null; } root=CreateHuffman(F,n); printf("\n先序遍曆二叉樹: \n"); Print (root); printf("\n遍曆葉子結點: \n"); leafprint(root); return 0;}
對於如何遍曆二叉樹先序,中序,後序都可以,隨意運行結果
將哈夫曼樹轉化成二叉樹