#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "string.h"typedef int ELEMTYPE;//哈弗曼树节点结构体
typedef struct HuffmanTree
{ELEMTYPE weight;ELEMTYPE id;//区分权值相同的节点struct HuffmanTree* lchild;struct HuffmanTree* rchild;
}HuffmanNode;//构建哈弗曼树
HuffmanNode* createHuffmanTree(int* T,int n)
{int i,j;HuffmanNode **temp,*huffmanTree;temp =(HuffmanNode**)malloc(n*sizeof(HuffmanNode));//将数组T中的权值赋值给节点中的weightfor(i=0;i<n;i++){temp[i]=(HuffmanNode*)malloc(sizeof(HuffmanNode));temp[i]->weight =T[i];temp[i]->id =i;temp[i]->lchild =temp[i]->rchild =NULL;}//构建哈弗曼树需要N-1合并for(i=0;i<n-1;i++){int small1=-1,small2;//将small1和small2分别作为最小值和次小值的下标//先将最小的两个下标赋值给small1和small2,对应权值未必最小for(j=0;j<n;j++){if(temp[j]!=NULL&&small1==-1){small1=j;continue;}else if(temp[j]!=NULL){small2=j;break;}}for(j=small2;j<n;j++)//比较权值,挪动small1和small2使之分别成为最小权值和次小权值的下标{if(temp[j]!=NULL){if(temp[j]->weight<temp[small1]->weight ){small2=small1;small1=j;}else if(temp[j]->weight<temp[small2]->weight){small2=j;}}}huffmanTree=(HuffmanNode*)malloc(sizeof(HuffmanNode));huffmanTree->weight =temp[small1]->weight +temp[small2]->weight;huffmanTree->lchild =temp[small1];huffmanTree->rchild =temp[small2];temp[small1]=huffmanTree;temp[small2]=NULL;}free(temp);return huffmanTree;
};//以广义表的形式打印哈弗曼树
void PrintHuffmanTree(HuffmanTree* huffmanTree)
{if(huffmanTree){printf("%d",huffmanTree->weight );if(huffmanTree->lchild !=NULL || huffmanTree->rchild !=NULL){printf("(");PrintHuffmanTree(huffmanTree->lchild);printf(",");PrintHuffmanTree(huffmanTree->rchild);printf(")");}}
};//求带权路径长度
ELEMTYPE WeightPthLength(HuffmanNode *huffmanTree,int len)
{if(huffmanTree==NULL) return 0;else {if(huffmanTree->lchild==NULL &&huffmanTree->rchild ==NULL) return huffmanTree->weight *len;else return WeightPthLength(huffmanTree->lchild ,len+1)+WeightPthLength(huffmanTree->rchild,len+1);}
}//递归哈夫曼编码
void Huffman_code(HuffmanNode* huffmanTree,int depth)
{static int code[10];if(huffmanTree){if(huffmanTree->lchild ==NULL&&huffmanTree->rchild ==NULL){printf("id为%d权值为%d的叶子节点的哈夫曼编码为",huffmanTree->id ,huffmanTree->weight );int i;for(i=0;i<depth;i++){printf("%d",code[i]);}printf("\n");}else{code[depth]=0;Huffman_code(huffmanTree->lchild,depth+1);code[depth]=1;Huffman_code(huffmanTree->rchild,depth+1);}}
}
int _tmain(int argc, _TCHAR* argv[])
{int i,n,*arr,WPL,len=0;printf("请输入叶节点的个数:\n");while(1){scanf("%d",&n);if(n>1)break;else printf("输入错误,请重新输入:");}arr=(int*)malloc(n*sizeof(ELEMTYPE));printf("请输入%d个叶节点的权值:\n",n);for(i=0;i<n;i++){scanf("%d",&arr[i]);}HuffmanTree* huffmanTree=NULL;huffmanTree=createHuffmanTree(arr, n);printf("此哈弗曼树的广义表形式为:\n");PrintHuffmanTree(huffmanTree);printf("\n");WPL=WeightPthLength(huffmanTree,len);printf("WPL=%d\n",WPL);printf("此哈弗曼树的叶节点的编码为:\n");Huffman_code(huffmanTree,0);system("pause");return 0;
}

HuffmanTree相关推荐

  1. 哈夫曼树(HuffmanTree)

    一.哈夫曼树简介 1.构建哈夫曼树 计算每个字符出现的概率,将这个概率做为权值之比. 利用这些带权值的字符构建出哈夫曼树. 具体构建步骤: ① 首先以每个带权重的字符作为根结点,组成森林,每个结点上存 ...

  2. HuffmanTree的创建、编码、解码操作

    #include <iostream> #include <cstdlib> #include <cstring> #pragma warning(disable: ...

  3. HuffmanTree和HuffmanCode

    HuffmanTree和HuffmanCoding 1.HuffmanTree HuffmanTree又称为最优二叉树,是一类带权路径长度最优的树. 假设有n结点,权值为{w1,w2,-,wn},构造 ...

  4. 可逼近信道容量编码技术之霍夫曼编码的实现

    可逼近信道容量编码技术之霍夫曼编码的实现 简介 在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视.哈夫曼编码正是一种应用广泛且非常有效 ...

  5. 贪心算法简单实践 -- 分糖果、钱币找零、最多区间覆盖、哈夫曼编解码

    1. 贪心算法概览 贪心算法是一种算法思想.希望能够满足限制的情况下将期望值最大化.比如:Huffman编码,Dijkstra单源最短路径问题,Kruskal最小生成树 等问题都希望满足限制的情况下用 ...

  6. 数据结构与算法:15 树

    15 树 知识结构: 1. 树的基本概念与术语 1.1 树的定义 树是N(N≥0)N(N \geq 0)N(N≥0)个结点组成的有穷集合 ,该集合具有如下特征: (1)除N=0N=0N=0的树外,有且 ...

  7. 技术图文:如何利用C#实现Huffman编码?

    背景 Huffman编码 在通信和数据压缩领域具有重要的应用. 在介绍 Huffman 编码具体实现之前,先介绍几个相关的概念. 概念1:树中结点的带权路径长度 – 根结点到该结点的路径长度与该结点权 ...

  8. 关于C++类实现哈夫曼树

    该哈夫曼树可以实现的功能: (1)能够通过键盘或者纯文本文件读入字符集的大小n,以及n个字符和权值来建立哈夫曼树,并且把建立好的哈夫曼树存入到HuffmanTree.txt中去. (2)利用已经建立好 ...

  9. java中哈夫曼编码所用的函数_数据结构(java语言描述)哈夫曼编码

    原理:哈夫曼编码是根据将已给出的权值作为叶子结点,生成一颗哈夫曼树,然后使得权重最小. 首先生成已给权重的所有的叶子结点,然后取所有节点中最小和次小的结点作为左右孩子生成一个哈夫曼树,计算出父节点的权 ...

最新文章

  1. 阿里云ECS上环境搭建(virtualenv+flask+gunicorn+supervisor+nginx)
  2. Python Matplotlib 中文显示参数设置
  3. ACM PKU1703 Find them, Catch them
  4. 表扬几位积极的同学!
  5. android重置系统,安卓手机越用越卡,恢复出厂设置真有用?别瞎搞,看完就明白了!...
  6. 群晖docker安装cms_Nas码农篇:群晖Docker安装Gitlab
  7. 计算机机器人方向,计算机考研想学习智能机器人方向都有那几个学校呢..._考研_帮考网...
  8. doe报告模板_【质量管理小组QCC活动】报告模板
  9. Django+Scrapy结合使用并爬取数据入库
  10. 常用的WebService
  11. 树形DP+DFS序+树状数组 HDOJ 5293 Tree chain problem(树链问题)
  12. (转)switch与ifelse的效率问题 .
  13. Extra Credits: Project Ten Dollar 10
  14. 用maven编译spark2.1.0
  15. Part I. S3. 区间直觉模糊集理论
  16. JAVA并发系列十九:深入理解ThreadLocal(三)–详解ThreadLocal内存泄漏问题
  17. 安装office后安装visiso后提示缺失文件的解决办法
  18. 非API接口限制介绍
  19. 火星人的耳机(Martian Headsets)
  20. 带着问题,再读ijkplayer源码

热门文章

  1. 不敢相信!那些真实存在的机器人女友们!
  2. 快速申请开通公众号门店小程序-微信小程序开发-视频教程7
  3. 区块链学习——区块链的架构
  4. 高端餐饮空间布局要点
  5. 【selenium-python】显式等待和隐式等待的使用和区别
  6. 转载 | 年度盘点!Flink 社区全年的精华内容都在这里啦
  7. 图片转成pdf格式怎么转?三个好用的方法教给你
  8. android一键添加QQ群,关注微信公众号
  9. Deepin系统安装docker
  10. linux中sed如何替换换行符,linux sed命令,如何替换换行符“\n”