二叉树的创建和哈夫曼编码
2019-05-18 本文已影响0人
suntwo
二叉树的创建
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
struct node *left;
struct node *right;
}node;
node *creattree() //先序创建
{
node *root=(node *)malloc(sizeof(node));
printf("输入数据,如果输入0表示结束:\n");
scanf("%d",&(root->data));
if(root->data==0)
return NULL; //表示叶子节点为NULL
root->left=creattree();
root->right=creattree();
return root; //返回一个节点的地址
}
int bianli(node *root) //先序遍历
{
if(root==NULL)
{
return 0;
}
printf("%d ",root->data);
bianli(root->left);
bianli(root->right);
}
int main()
{
node *root;
root=creattree();
bianli(root);
return 0;
}
哈夫曼树
typedef struct node{
struct node *left;
struct node *right;
int data;
int tag; //标志
}node;
node aa[1000];
int init()
{
printf("输入节点的个数\n");
int n;
scanf("%d",&n);
int i;
for(i=0;i<n;++i)
{
printf("输入权值\n");
scanf("%d",&aa[i].data);
}
return n; //返回数据的个数
}
int min(int n) //寻找最小值
{
int i,xiabiao=1;
int min=10000;
for(i=0;i<n;++i)
{
if(aa[i].data<min && aa[i].tag==0)
{
min=aa[i].data;
xiabiao=i; //记录下标
}
}
aa[xiabiao].tag=1;
return xiabiao;
}
int hfm(int n)
{
int i;
for(i=0;i<n-1;++i)
{
int min1,min2;
min1=min(n+i); //返回下表
min2=min(n+i);
aa[n+i].left=min1;
aa[n+i].right=min2;
aa[n+i].data=aa[min1].data+aa[min2].data;
printf("%d %d\n",aa[min1].data,aa[min2].data);
}
}
int main()
{
int n=init();
hfm(n);
for(int i=0;i<2*n-1;++i)
{
printf("%d ",aa[i].data);
}
}