首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

带权路径长度如何求

2012-04-08 
带权路径长度怎么求?# include stdio.h#define n 6#define m 2*n-1typedef struct{float weightint par

带权路径长度怎么求?
# include <stdio.h>
#define n 6
#define m 2*n-1

typedef struct{
float weight;
int parent,lchild,rchild;
}hufmtree;
hufmtree tree[m];
void Hufmtree()

int i,j,p1,p2;
float small1,small2,f,maxval=10000.00; 
int WPL=0;
 printf("\n\t\t请输入%d棵树(叶子)的权值\nplease:\n\n",n);

 for (i=0;i<m;i++) 
  { tree[i].parent=0; 
  tree[i].lchild=0; 
  tree[i].rchild=0; 
  tree[i].weight=0.0; 
  } 
  for (i=0;i<n;i++) 
  { printf("tree[%d].weight=",i);

scanf("%f",&f); 
  tree[i].weight=f; 
  } 
  for (i=n;i<m;i++) 
  { p1=0; p2=0; 
  small1=maxval; small2=maxval; 
  for (j=0;j<=i-1;j++) 
  if (tree[j].parent==0) 
  if (tree[j].weight<small1) 
  { small1= tree[j].weight; 
  p2=p1; p1=j; 
  } 
   
  else 
  if (tree[j].weight<small2) 
  { small2=tree[j].weight; 
  p2=j; 
  } 
  tree[p1].parent=i+1; 
  tree[p2].parent=i+1; 
  tree[i].lchild=p1+1; 
  tree[i].rchild=p2+1; 
  tree[i].weight=tree[p1].weight+ tree[p2].weight;  
}printf("\n");
for(i=n;i<m;i++) 
{ printf("tree[%d].weight=%.2f\n",i,tree[i].weight);}

   
  
}

void main()
{
  Hufmtree();

 



[解决办法]
自己去找灵感!

C/C++ code
/*------------------------------------------------------   假设字符串序列{A,B,C,D},对应的权重为{1,3,6,9}.设计一个   哈弗曼树,并输出对应的哈弗曼编码。--------------------*/#include<stdio.h>#include<string.h>#include<malloc.h>typedef struct {    int weight;    int parent,lchild,rchild;}HTNode,*Huffman;Huffman HuffmanTree;char **HuffmanCode;//用于存放每个字符的哈弗曼编码int MIN;     //用于存放最小的权值,因为我们要将权值最小的节点放在哈夫曼树的最右下端             //其编码值为1,从而和其他节点相区分void InitHuffmanTree(int *hw,int n);void CtreateHuffmanTree(int *hw,int n,int max);void SelectMin(int *hw,int n,int *k);void GetHuffmanCode(int n);void Reverse(char *str);int main(){    int m,n,i;    int HuffmanWeight[]={1,3,6,9};    char HuffmanString[]="ABCD";    n=strlen(HuffmanString);    m=2*n-1;//因为有n个叶子节点,则需要建立的哈夫曼树总节点个数为2*n-1个    HuffmanCode=(char **)malloc(n*sizeof(char *));  //分配空间    HuffmanTree=(Huffman)malloc(m*sizeof(HTNode));    InitHuffmanTree(HuffmanWeight,n);    CtreateHuffmanTree(HuffmanWeight,n,m);    GetHuffmanCode(n);    for(i=0;i<n;i++)    {        printf("权值为%d的哈弗曼编码为:%s\n",HuffmanTree[i].weight,HuffmanCode[i]);    }    return 0;    }void InitHuffmanTree(int *hw,int n){      int i,j;    for(i=0,j=0;i<n&&j<n;i++,j++)                          //前n个单元用于存放叶子节点即需要编码的节点    {        HuffmanTree[i].weight=hw[j];        HuffmanTree[i].parent=0;        HuffmanTree[i].lchild=0;        HuffmanTree[i].rchild=0;    }    HuffmanTree[2*n-2].parent=-1;   //使根节点的父节点为-1    }void CtreateHuffmanTree(int *hw,int n,int max){  int i=0,j,k;  SelectMin(hw,n,&k);  HuffmanTree[k].parent=n;  HuffmanTree[n].lchild=k;  HuffmanTree[n].weight+=HuffmanTree[k].weight;  MIN=HuffmanTree[k].weight;  //将最小的权值存放于MIN  SelectMin(hw,n,&k);  HuffmanTree[k].parent=n;  HuffmanTree[n].rchild=k;  HuffmanTree[n].weight+=HuffmanTree[k].weight;  for(i=2,j=n+1;i<n&&j<max;i++,j++)  {      SelectMin(hw,n,&k);      HuffmanTree[k].parent=HuffmanTree[j-1].parent=j;      HuffmanTree[j].lchild=k;      HuffmanTree[j].rchild=j-1;      HuffmanTree[j].weight=HuffmanTree[k].weight+HuffmanTree[j-1].weight;  }}void SelectMin(int *hw,int n,int *k)  /*筛选出权值最小的节点,并将其下标存于k*/{    int i;    int min=1000;    /*这里为了方便先将min初始化为一个较大的数*/    for(i=0;i<n;i++)    {        if(HuffmanTree[i].weight<min&&HuffmanTree[i].parent==0)        {            min=HuffmanTree[i].weight;            *k=i;        }        }    HuffmanTree[*k].parent=1;   /*这里将其parent赋值为1表示已被筛选过了*/}void GetHuffmanCode(int n){    int p=0,i=0,j;        char buffer[10]={0};    while(p<n)    {        j=p;        while(HuffmanTree[j].parent!=-1)        {           if(j>=n||HuffmanTree[j].weight==MIN)               buffer[i++]='1';          //右节点值为1           else buffer[i++]='0';         //左节点值为0           j=HuffmanTree[j].parent;        }        buffer[i]='\0';        Reverse(buffer);  //先将字符串翻转        HuffmanCode[p]=(char*)malloc(sizeof(char)*10);        strcpy(HuffmanCode[p],buffer);        i=0;               /*初始化缓冲区*/        p++;    }}void Reverse(char *str){    int i,j;    char c;    for(i=0,j=strlen(str)-1;i<j;i++,j--)    {        c=str[i];        str[i]=str[j];        str[j]=c;    }}/*权值为1的哈弗曼编码为:111权值为3的哈弗曼编码为:110权值为6的哈弗曼编码为:10权值为9的哈弗曼编码为:0Press any key to continue*/ 

热点排行