構造哈夫曼樹算法C/C++

一、哈夫曼樹的基本概念
最優二叉樹也稱哈夫曼樹,是指對於一組帶有確定權值的葉節點,構造的具有最小帶權路徑長度的二叉樹。

二、哈夫曼樹的結構
這裏寫圖片描述
假設有n個權值,則構造出的哈夫曼樹有n個葉子結點。 n個權值分別設爲 w1、w2、…、wn,則哈夫曼樹的構造規則爲:

(1) 將w1、w2、…,wn看成是有n 棵樹的森林(每棵樹僅有一個結點);

(2) 在森林中選出兩個根結點的權值最小的樹合併,作爲一棵新樹的左、右子樹,且新樹的根結點權值爲其左、右子樹根結點權值之和;

(3)從森林中刪除選取的兩棵樹,並將新樹加入森林;

(4)重複(2)、(3)步,直到森林中只剩一棵樹爲止,該樹即爲所求得的哈夫曼樹

三、構造哈夫曼樹算法

/*
 *構造哈夫曼樹算法
 */
#include<stdio.h>
#include<malloc.h>
#define MAXVALUE 1000 //定義最大權值
#define MAXLEAF 30 //定義最大葉子樹
#define MAXNODE 2 * MAXLEAF - 1

/*
 *定義哈夫曼樹的存儲結構
 */
typedef struct
{
    int weight ; //權值
    int parent ; //父節點的位置
    int lchild ;
    int rchild ;
} HNodeType ;

/*
 *構造哈夫曼樹算法
 */
void HaffmanTree(HNodeType HuffNode [])
{
    int i , j , m1 , m2 , x1 , x2 , n ;
    scanf("%d" , &n) ; //輸入葉子節點個數
    /*
     *哈夫曼樹的初始化
     */
    for(i = 0 ;i < 2 * n - 1 ; i++)
    {
     HuffNode[i].weight = 0 ;
     HuffNode[i].parent = -1 ;
     HuffNode[i].lchild = -1 ;
     HuffNode[i].rchild = -1 ;
    }
    for(i = 0 ;i < n ; i++)
    {
        scanf("%d" , &HuffNode[i].weight) ; //輸入各個葉子節點的權值
    }
    /*
     *構造哈夫曼樹
     */
     for(i = 0 ; i < n - 1 ; i++)
     {
         m1 = m2 = MAXVALUE ;
         x1 = x2 = 0 ;
         /*
          *選取兩棵權值最小的子樹
          */
         for(j = 0 ; j < n + i ; j++)
         {
             if(HuffNode[j].weight < m1 && HuffNode[j].parent == -1)
             {
                 m2 = m1 ;
                 x2 = x1 ;
                 m1 = HuffNode[j].weight ;
                 x1 = j ;
             }
             else if(HuffNode[j].weight < m2 && HuffNode[j].parent == -1)
             {
                 m2 = HuffNode[j].weight ;
                 x2 = j ;
             }
         }
         /*
          *將找出的兩棵子樹合併爲一棵子樹
          */
         HuffNode[x1].parent = n + i ;
         HuffNode[x2].parent = n + i ;
         HuffNode[n+i].weight = HuffNode[x1].weight + HuffNode[x2].weight ;
         HuffNode[n+i].lchild = x1 ;
         HuffNode[n+i].rchild = x2 ;
     }
     for(i = 0 ; i < 2 * n - 1 ; i++)
     {
         printf("%d %d %d %d \n" , HuffNode[i].weight , HuffNode[i].parent , HuffNode[i].lchild , HuffNode[i].rchild) ;
     }
}
/*
 *進行哈夫曼樹的測試
 */
void main()
{
    HNodeType HuffNode[MAXNODE] ;
    HaffmanTree(HuffNode) ;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章