数据结构哈夫曼树

原创 2016年11月25日 23:36:08
#include <stdio.h>
#include<stdlib.h>
#include"stdafx.h"
#define MAXBIT      100
#define MAXVALUE  10000
#define MAXLEAF     30
#define MAXNODE    MAXLEAF*2 -1

typedef struct
{
    int bit[MAXBIT];
    int start;
} HCodeType;        /* 编码结构体 */
typedef struct
{
    int weight;
    int parent;
    int lchild;
    int rchild;
    int value;
} HNodeType;        /* 结点结构体 */

/* 构造一颗哈夫曼树 */
void HuffmanTree(HNodeType HuffNode[MAXNODE], int n)
{
    /* i、j: 循环变量,m1、m2:构造哈夫曼树不同过程中两个最小权值结点的权值,
    x1、x2:构造哈夫曼树不同过程中两个最小权值结点在数组中的序号。*/
    int i, j, m1, m2, x1, x2;
    /* 初始化存放哈夫曼树数组 HuffNode[] 中的结点 */
    for (i = 0; i<2 * n - 1; i++)
    {
        HuffNode[i].weight = 0;//权值
        HuffNode[i].parent = -1;
        HuffNode[i].lchild = -1;
        HuffNode[i].rchild = -1;
        HuffNode[i].value = i; //实际值,可根据情况替换为字母  
    } /* end for */

    /* 输入 n 个叶子结点的权值 */
    for (i = 0; i<n; i++)
    {
        printf("Please input weight of leaf node %d: \n", i);
        scanf("%d", &HuffNode[i].weight);
    } /* end for */

    /* 循环构造 Huffman 树 */
    for (i = 0; i<n - 1; i++)
    {
        m1 = m2 = MAXVALUE;     /* m1、m2中存放两个无父结点且结点权值最小的两个结点 */
        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;
            }
        } /* end for */
        /* 设置找到的两个子结点 x1、x2 的父结点信息 */
        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;

        printf("x1.weight and x2.weight in round %d: %d, %d\n", i + 1, HuffNode[x1].weight, HuffNode[x2].weight);  /* 用于测试 */
        printf("\n");
    } /* end for */
    /*  for(i=0;i<n+2;i++)
    {
    printf(" Parents:%d,lchild:%d,rchild:%d,value:%d,weight:%d\n",HuffNode[i].parent,HuffNode[i].lchild,HuffNode[i].rchild,HuffNode[i].value,HuffNode[i].weight);
    }*///测试
} /* end HuffmanTree */

//解码
void decodeing(char string[], HNodeType Buf[], int Num)
{
    int i, tmp = 0, code[1024];
    int m = 2 * Num - 1;
    char *nump;
    char num[1024];
    for (i = 0; i<strlen(string); i++)
    {
        if (string[i] == '0')
            num[i] = 0;
        else
            num[i] = 1;
    }
    i = 0;
    nump = &num[0];

    while (nump<(&num[strlen(string)]))
    {
        tmp = m - 1;
        while ((Buf[tmp].lchild != -1) && (Buf[tmp].rchild != -1))
        {

            if (*nump == 0)
            {
                tmp = Buf[tmp].lchild;
            }
            else tmp = Buf[tmp].rchild;
            nump++;

        }

        printf("%d", Buf[tmp].value);
    }


}


int main(void)
{

    HNodeType HuffNode[MAXNODE];            /* 定义一个结点结构体数组 */
    HCodeType HuffCode[MAXLEAF], cd;       /* 定义一个编码结构体数组, 同时定义一个临时变量来存放求解编码时的信息 */
    int i, j, c, p, n;
    char pp[100];
    printf("Please input n:\n");
    scanf("%d", &n);
    HuffmanTree(HuffNode, n);


    for (i = 0; i < n; i++)
    {
        cd.start = n - 1;
        c = i;
        p = HuffNode[c].parent;
        while (p != -1)   /* 父结点存在 */
        {
            if (HuffNode[p].lchild == c)
                cd.bit[cd.start] = 0;
            else
                cd.bit[cd.start] = 1;
            cd.start--;        /* 求编码的低一位 */
            c = p;
            p = HuffNode[c].parent;    /* 设置下一循环条件 */
        } /* end while */

        /* 保存求出的每个叶结点的哈夫曼编码和编码的起始位 */
        for (j = cd.start + 1; j<n; j++)
        {
            HuffCode[i].bit[j] = cd.bit[j];
        }
        HuffCode[i].start = cd.start;
    } /* end for */

    /* 输出已保存好的所有存在编码的哈夫曼编码 */
    for (i = 0; i<n; i++)
    {
        printf("%d 's Huffman code is: ", i);
        for (j = HuffCode[i].start + 1; j < n; j++)
        {
            printf("%d", HuffCode[i].bit[j]);
        }
        printf(" start:%d", HuffCode[i].start);

        printf("\n");

    }
    /*    for(i=0;i<n;i++){
    for(j=0;j<n;j++)
    {
    printf ("%d", HuffCode[i].bit[j]);
    }
    printf("\n");
    }*/
    printf("Decoding?Please Enter code:\n");
    scanf("%s", &pp);
    decodeing(pp, HuffNode, n);
    getch();
    return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

哈夫曼树的构造以及编码实现

哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树或者赫夫曼树,它是最优二叉树。 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼...
  • u012532559
  • u012532559
  • 2015年03月24日 12:35
  • 10488

数据结构(15)--哈夫曼树以及哈夫曼编码的实现

1.哈夫曼树     假设有n个权值{w1, w2, ..., wn},试构造一棵含有n个叶子结点的二叉树,每个叶子节点带权威wi,则其中带权路径长度WPL最小的二叉树叫做最优二叉树或者哈夫曼树。  ...
  • u010366748
  • u010366748
  • 2016年03月01日 17:28
  • 6256

数据结构树--哈夫曼树

决心写一个哈夫曼树,巩固自己学的数据结构  一、最优树的定义  结点的路径长度定义为:       从根结点到该结点的路径上       分支的数目。 树的路径长度定义为...
  • gaoxin1076
  • gaoxin1076
  • 2012年12月02日 21:38
  • 5186

数据结构之---C语言实现哈夫曼树和编码

数据结构之---C语言实现哈夫曼树和编码
  • u012965373
  • u012965373
  • 2015年07月03日 00:03
  • 6062

数据结构::如何实现哈夫曼树

【哈夫曼树的定义】:     哈夫曼树又称为最优二叉树,它是加权路径最短的二叉树。     不同于普通的二叉树,它的每个节点都有相应的权值,当我们构建的时候最终离根节点远的节点权重小,反之就比较大。...
  • lalu58
  • lalu58
  • 2017年01月01日 20:13
  • 1637

哈夫曼树的构造

注意:哈夫曼树并不唯一,但带权路径长度一定是相同的。 (1)8个结点的权值大小如下: (2)从19,21,2,3,6,7,10,32中选择两个权小结点。选中2,3。同时算出...
  • qq_33990383
  • qq_33990383
  • 2016年11月07日 22:43
  • 4076

数据结构-哈夫曼树的实现

  • 2017年11月16日 10:26
  • 179KB
  • 下载

【数据结构】哈夫曼树

1、背景知识 1、路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第L层结点的路径长度...
  • shujh_sysu
  • shujh_sysu
  • 2016年08月10日 19:09
  • 846

数据结构之哈夫曼树

一.什么是哈夫曼树基本概念 节点之间的路径:一个结点到另一个结点,所经过节点的结点序列。 结点之间的路径长度:结点之间路径上的分支数(边),如汽车到下一站的路径长度为1。 树的...
  • chenweicheer
  • chenweicheer
  • 2016年10月15日 15:17
  • 3471

数据结构例程——哈夫曼树

本文是数据结构基础系列(6):树和二叉树中第15课时哈夫曼树的例程。#include #include #define N 50 //叶子结点数 #define M 2*N-1 ...
  • sxhelijian
  • sxhelijian
  • 2015年10月20日 05:48
  • 2558
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:数据结构哈夫曼树
举报原因:
原因补充:

(最多只允许输入30个字)