c++ 数据结构-一个程序,哈夫曼树的构造遍历打印,编码解码,缺少遍历和打印

问题描述

一个程序,哈夫曼树的构造遍历打印,编码解码,缺少遍历和打印

#include
#include /* 数组头文件 /
#include
#define MAX 999 /
定义长度 /
typedef struct{ /
定义哈夫曼编码的结构数组 /
char data;
int weight; /
定义权值 /
int parent;
int lchild;
int rchild;
}huffmannode;
typedef struct{ /
定义保存哈夫曼结构体 /
char bits[50];
int start;
}huffmancode ;
void main()
{
huffmannode ht[100]; /
定义储存权值的空间 /
huffmancode cd[100];
char string[100]; /
定义数组存储空间 /
char hcd[100];
int i,j,x,y,s1,s2,m1,m2,n,c,f,k;
printf("please input the n ="); /
输入字符的个数 /
scanf("%d",&n);
printf("n============================n");
for(i=0;i<n;i++)
{

getchar(); / 获得输入的字符 /
printf("please input the value :");
scanf("%c",&ht[i].data); /
输入字符函数 /
printf("please input the weight:n");
scanf("%d",&ht[i].weight);
}
printf("n=============================n");
for(i=0;i<2*n-1;i++)
{
ht[i].parent=ht[i].lchild=ht[i].rchild=-1; /
初始化父结点,左右子结点 /
}
for (i=n;i<2*n-1;i++)
{
s1=s2=0; /
初始化变量 /
m1=m2=MAX;
for (j=0;j<i;j++)
{
if (ht[j].weight<m1 &&ht[j].parent==-1) /
寻找无父结点的最小值 /
{
m2=m1;
s2=s1;
m1=ht[j].weight;
s1=j; /
寻找当前最小值 /
}
else if(ht[j].weight<m2 &&ht[j].parent==-1) /
寻找无父结点的次小值 /
{
m2=ht[j].weight;
s2=j;
} /
寻找次小值 /
}
ht[s1].parent=i; /
s1的父结点为i /
ht[s2].parent=i;
ht[i].weight=m1+m2; /
最小值的权值相加为i的权值 /
ht[i].lchild=s1; /
i的左子为s1 /
ht[i].rchild=s2; /
i的右子为s2 /
}
for(i=0;i<n;i++)
{
cd[i].start=n;
x=i;
y=ht[x].parent; /
记录父结点 /
while (y!=-1)
{
if (ht[y].lchild==x)
cd[i].bits[cd[i].start]='0'; /
给字符赋0值 /
else
cd[i].bits[cd[i].start]='1'; /
给字符赋1值 /
cd[i].start--;
x=y;
y=ht[y].parent;
}
}
printf("cout the huffmancode:n");
for (i=0;i<n;i++)
{
printf("%c:",ht[i].data); /
输出字符 /
for(j=cd[i].start;j<=n;j++){
printf("%c",cd[i].bits[j]); /
输出字符的01代码 /
}
printf("n");
}
printf("n=============================n");
printf("n Please input the message:n");
scanf("%s",string); /
输入字符串 /
for(i=0;string[i]!='0';i++)
{
for(c=0;c<=n;c++)
if(string[i]==ht[c].data) /
寻找与输入字符相匹配的字母 /
{
for(j=cd[c].start;j<=n;j++)
printf("%c",cd[c].bits[j]); /
输出字母代码 /
break;
}
}
printf("n=============================n");
printf("Please input the HuffmanCode:n");
scanf("%s",hcd); /
输入0、1代码 /
f=2*n-2;
for(i=0;hcd[i]!='';i++)
{
if(hcd[i]=='0') /
判断输入为0,寻找左子 /
f=ht[f].lchild;
else if(hcd[i]=='1')
f=ht[f].rchild; /
判断输入为1,寻找右子 /
if(f<n)
{
printf("%c",ht[f].data); /
输出字符串 */
f=2*n-2;
}
}
printf("n");
getch();

}

解决方案

步骤1.构造哈夫曼树,
2.输入字符个数
3.输入字符
4.输入权值
5.遍历打印输出树
6.乱序输入字符,输出编码
7.乱序输入编码,输出对应字符

解决方案二:

http://blog.csdn.net/yue7603835/article/details/7574637

解决方案三:

http://touch-2011.iteye.com/blog/1058800

时间: 2024-09-14 15:08:40

c++ 数据结构-一个程序,哈夫曼树的构造遍历打印,编码解码,缺少遍历和打印的相关文章

哈夫曼树 c++-提问:要写一个关于哈夫曼树的头文件,里面应该包括什么内容?

问题描述 提问:要写一个关于哈夫曼树的头文件,里面应该包括什么内容? 要写一个哈夫曼树的头文件,里面有左子,右子,父结点,权值还应该有什么???请大家帮忙,谢谢!! 解决方案 http://blog.csdn.net/hackerain/article/details/6011110 从这个里面提取出来方法和变量

Java实现哈夫曼树的构造

哈夫曼树的内容这里不作解释,请自己搜索.下面给出哈夫曼树构造过程的 Java 实现. 结点类: 1./** 2. * 二叉树节点 3. */ 4.public class Node implements Comparable { 5. 6. private int value; 7. 8. private Node leftChild; 9. 10. private Node rightChild; 11. 12. public Node(int value) { 13. this.value

数据结构-----哈夫曼树的构造以及遍历

/* 根据Huffman树的构造原理进行构造 ... 哈夫曼树在编码压缩的领域有很好的应用,利用Huffman进行编码可以保证数据传输 的无二义性 . 但是要注意的是 对于出现频率大的数据我们应该尽量放在离根节点近的地方进行编码 , 出现频率小的数据我们可以放在距离根节点小的地方. 这样可以提高数据的传输效率 . */ #include "stdio.h" #include "malloc.h" ///节点声明 typedef struct node{ node *

【算法导论】哈夫曼树及编译码

哈夫曼树及编译码 哈夫曼树,又称二叉树,是一类带权路径长度最短的树.所谓路径长度,就是节点到树根之间的路径长度与节点权值的乘积.哈夫曼本人曾在MIT的信息论研究生班学习.Robert Fano教授让学生们自己决定是参加期未考试还是做一个大作业.而哈夫曼选择了后者,原因很简单,因为解决一大作业可能比期未考试更容易通过.Robert Fano教授也是信息论的先驱,学过信息论的都知道有Fano不等式,Shannon-Fano编码.当时这个大作业,Fano也解决不了,哈夫曼并不知道,于是自己尝试,最终产

数据结构-构造哈夫曼树的小问题

问题描述 构造哈夫曼树的小问题 完整程序在这里:http://wenku.baidu.com/view/dde580a9376baf1ffc4fadbf template class HfmTree :public BinaryTree { public: operator T()const { return weight; } T getW(){ return weight; } void putW(const T& x){ weight = x; } void SetNull(){ root

哈夫曼树(三) Java详解

哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树.这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答. (01) 路径和路径长度 定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.通路中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1. 例子:100和80的路径长度是

哈夫曼树(二) C++详解

哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树.这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答. (01) 路径和路径长度 定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.通路中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1. 例子:100和80的路径长度是

哈夫曼树(一) C语言详解

哈夫曼树的介绍 Huffman Tree,中文名是哈夫曼树或霍夫曼树,它是最优二叉树. 定义:给定n个权值作为n个叶子结点,构造一棵二叉树,若树的带权路径长度达到最小,则这棵树被称为哈夫曼树.这个定义里面涉及到了几个陌生的概念,下面就是一颗哈夫曼树,我们来看图解答. (01) 路径和路径长度 定义:在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径.通路中分支的数目称为路径长度.若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1. 例子:100和80的路径长度是

编码-哈夫曼树,请问大神们,下面的译码部分怎么没有输出?请大神们帮我修改下~~~(最好再加个能有个文件输出)

问题描述 哈夫曼树,请问大神们,下面的译码部分怎么没有输出?请大神们帮我修改下~~~(最好再加个能有个文件输出) #include #include #include #define maxsize 100 #define max 100 typedef struct { char data; int weight; int parent; int lchild; int rchild; }huffnode; typedef struct { char cd[max]; int start; }