將哈夫曼樹轉化成二叉樹

來源:互聯網
上載者:User

標籤:樹

               今晚感覺好爽啊,好久好久沒有這種感覺,起床需要點爆發力,做事還需要點動力,給自己都沒有下過這麼大的決心寫代碼,幫她卻寫的很好,我自己都吃驚了。哈哈哈。。。今晚也是幫她寫好西郵導航睡不著,那就敲了一下哈夫曼樹轉化成二叉樹的代碼,其實理解了真的不難,我定義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;}    

 

對於如何遍曆二叉樹先序,中序,後序都可以,隨意運行結果

 

 

 

將哈夫曼樹轉化成二叉樹

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.