数据结构上机——哈夫曼树 线索二叉树
来源:互联网 发布:数控车床计算软件下载 编辑:程序博客网 时间:2024/06/07 23:39
哈夫曼树
#include<stdio.h>#include<stdlib.h>#include<string.h>#define N 5 //叶子节点数#define M 2*N-1 //哈夫曼树结点#define MAX 10000typedef char TElemType;//三叉链表typedef struct { unsigned int weight; int parent; int lchild; int rchild;} HTNode;typedef HTNode HuffmanTree[M+1];typedef char * HuffmanCode[N+1];//存储每个字符的哈夫曼编码表void select(HuffmanTree HT, int k, int &s1, int &s2);//构造哈夫曼树void createHuffmanTree(HuffmanTree &HT, int *w, int n) { if(n <= 1) return; for(int i = 1; i <= n; i++) { HT[i].weight = w[i]; HT[i].lchild = 0; HT[i].parent = 0; HT[i].rchild = 0; } for(int i=1; i <=M; i++) { HT[i].weight = 0; HT[i].lchild = 0; HT[i].parent = 0; HT[i].rchild = 0; } for(int i = n+1; i <= M; i++) { int s1, s2; select(HT, i-1, s1, s2);//选择parent为0的且权值最小的2结点 HT[s1].parent = i; HT[s2].parent = i; HT[i].lchild = s1; HT[i].rchild = s2; HT[i].weight = HT[s1].weight + HT[s2].weight; }}void select(HuffmanTree HT, int k, int &s1, int &s2) { unsigned int tmp = MAX, tmpi = 0; for(int i = 1; i <= k; i++) { if(!HT[i].parent) { if(tmp > HT[i].weight) { tmp = HT[i].weight; tmpi = i; } } } s1 = tmpi; tmp = MAX; tmpi = 0; for(int i = 1; i <= k; i++) { if((!HT[i].parent) && i!=s1) { //parent为0 if(tmp > HT[i].weight) { tmp = HT[i].weight; tmpi = i; } } } s2 = tmpi;}//求解哈夫曼编码void encodingHuffmanCode(HuffmanTree HT, HuffmanCode &HC) { char tmp[N]; tmp[N-1] = '\0'; int start, c, f; for(int i = 1; i <= N; i++) { start = N-1; c = i; f = HT[i].parent; while(f) { if(HT[f].lchild == c) { tmp[--start] = '0'; } else { tmp[--start] = '1'; } c = f; f = HT[f].parent; } HC[i] = (char *)malloc((N-start)*sizeof(char)); strcpy(HC[i], &tmp[start]); }}//打印哈夫曼编码表void printHuffmanCoding(HuffmanCode HC, char ch[]) { printf("\n"); for(int i = 1; i <= N; i++) { printf("%c:%s\n", ch[i], HC[i]); } printf("\n");}int main() { HuffmanTree HT; TElemType ch[N+1]; int w[N+1]; printf("请输入%d个字符以及该字符对应的权值(如:a,20):\n", N); for(int i = 1; i <= N; i++) { scanf("%c,%d", &ch[i], &w[i]); getchar(); } createHuffmanTree(HT, w , N); HuffmanCode HC; encodingHuffmanCode(HT, HC);//为每个字符求解哈夫曼编码 printHuffmanCoding(HC, ch); return 0;}//a,20 b,30 c,40 d,10 e,60
中序线索二叉树
#include <stdio.h>#include <stdlib.h>typedef char ElemType;typedef enum {Link, Thread} PointerTag;//PointerTag为标志,Link=0代表指针,Thread=1代表线索typedef struct BiThrNode { char data; struct BiThrNode *lchild, *rchild; PointerTag ltag; PointerTag rtag;} BiThrNode, *BiThrTree;BiThrTree pre;void CreateBiThrTree( BiThrTree *T ) { char c; scanf("%c", &c); if( '@' == c ) { *T = NULL; } else { *T = (BiThrNode *)malloc(sizeof(BiThrNode)); (*T)->data = c; (*T)->ltag = Link; (*T)->rtag = Link; CreateBiThrTree(&(*T)->lchild); CreateBiThrTree(&(*T)->rchild); }}// 中序遍历线索化void InThreading(BiThrTree T) { if( T ) { InThreading( T->lchild ); // 递归左孩子线索化 if( !T->lchild ) { // 如果该结点没有左孩子,设置ltag为Thread,并把lchild指向刚刚访问的结点。 T->ltag = Thread; T->lchild = pre; } if( !pre->rchild ) { pre->rtag = Thread; pre->rchild = T; } pre = T; InThreading( T->rchild ); // 递归右孩子线索化 }}void InOrderThreading( BiThrTree *p, BiThrTree T ) { *p = (BiThrTree)malloc(sizeof(BiThrNode)); (*p)->ltag = Link; (*p)->rtag = Thread; (*p)->rchild = *p; if( !T ) { (*p)->lchild = *p; } else { (*p)->lchild = T; pre = *p; InThreading(T); pre->rchild = *p; pre->rtag = Thread; }}void visit( char c ) { printf("%c", c);}// 中序遍历二叉树void InOrderTraverse( BiThrTree T ) { BiThrTree p; p = T->lchild; while( p != T ) { while( p->ltag == Link ) { p = p->lchild; } visit(p->data); while( p->rtag == Thread && p->rchild != T ) { p = p->rchild; visit(p->data); } p = p->rchild; }}int main() { BiThrTree P, T = NULL; CreateBiThrTree( &T ); InOrderThreading( &P, T ); printf("中序遍历输出结果为: "); InOrderTraverse( P ); printf("\n"); return 0;}//ABC@@DE@G@@F@@@
阅读全文
0 0
- 数据结构上机——哈夫曼树 线索二叉树
- 数据结构——线索二叉树
- 数据结构——线索二叉树
- 数据结构——线索化二叉树
- 数据结构——线索二叉树
- 数据结构——线索二叉树
- 数据结构——线索化二叉树
- 数据结构 — 二叉树的线索化
- 数据结构-->线索二叉树
- 数据结构--线索二叉树
- 【数据结构】线索二叉树
- 数据结构-线索二叉树
- 数据结构 - 线索二叉树
- 线索二叉树-数据结构
- 【数据结构】线索二叉树
- 数据结构-线索二叉树
- 数据结构--线索二叉树
- 数据结构---线索二叉树
- JPA Specification常用查询+排序
- 你可能不知道的RoR 5点技巧
- H.264 打包 MPEG-TS 流
- wps自动备份的文件,备份到本地哪里了?
- 【097】Nginx实现一台服务器,两个域名发布不同的前端项目,并且两个域名都用80端口。
- 数据结构上机——哈夫曼树 线索二叉树
- 【第三方类库】Java Guava , Google Guava
- C#个人重构之充值
- C# 静态构造函数
- python︱imagehash中的四种图像哈希方式(phash/ahash/dhash/小波hash)
- 【云计算的1024种玩法】手把手教你如何编译升级 OpenResty
- java文件读写操作大全
- maven常用的命令
- android圆形图片工具类