美文网首页
二叉树的创建和哈夫曼编码

二叉树的创建和哈夫曼编码

作者: suntwo | 来源:发表于2019-05-18 17:13 被阅读0次

二叉树的创建

#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);
    }
}

相关文章

网友评论

      本文标题:二叉树的创建和哈夫曼编码

      本文链接:https://www.haomeiwen.com/subject/wmitzqtx.html