樹的由來
首先要了解樹的概念。樹並不是指植物,而是一種數據結構,因為其存放方式頗有點象一棵樹有樹叉因而稱為樹。
最簡哈夫曼樹是由德國數學家馮 哈夫曼 發現的,此樹的特點就是引出的路程最短。它的形狀單支形式。
數對於編程具有重大的意義,是某些看似不可能完成或是很難完成的任務較為簡單,有條理的完成。
樹的套用
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<conio.h>a
#include<graphics.h>
#define MAXVALUE 200 /*權值的最大值*/
#define MAXB99v 30 /*最大的編碼位數*/
#define MAXNODE 30 /*初始的最大的結點數*/
struct haffnode
{char data;
int weight;
int flag;
int parent; /*雙親結點的下標*/
int leftchild; /*左孩子下標*/
int rightchild; /*右孩子下標*/
};
struct haffcode
{int bit[MAXNODE];
int start; /*編碼的起始下標*/
char data;
int weight; /*字元權值*/
};
樹的構建
/*函式說明*/
/************************************************************************/
void pprintf(struct haffcode haffcode[],int n);
/*輸出函式*/
void haffmantree(int weight[],int n,struct haffnode hafftree[],char data[]);
/*建立哈夫曼樹*/
void haffmancode(struct haffnode hafftree[],int n,struct haffcode haffcode[]);
/*求哈夫曼編碼*/
void test(struct haffcode haffcode[],int n);
/*測試函式*/
void end();
/*結束界面函式*/
/************************************************************************/void haffmantree(int weight[],int n,struct haffnode hafftree[],char data[])
/*建立葉結點個數為n,權值數組為weight[]的哈夫曼樹*/
{int i,j,m1,m2,x1,x2;
/*哈夫曼樹hafftree[]初始化,n個葉結點共有2n-1個結點*/
for(i=0;i<2*n-1;i++)
{if(i<n) {hafftree[i].data=data[i];
hafftree[i].weight=weight[i]; /*葉結點*/
}
else {hafftree[i].weight=0; /*非葉結點*/
hafftree[i].data="\0";
}
hafftree[i].parent=0; /*初始化沒有雙親結點*/
hafftree[i].flag=0;
hafftree[i].leftchild=-1;
sp; hafftree[i].rightchild=-1;
}
for(i=0;i<n-1;i++) /*構造哈夫曼樹n-1個非葉結點*/