哈夫曼算法建立最优二叉树
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哈夫曼算法建立最优二叉树
————————————————————————————————作者:————————————————————————————————日期:
#include
#include
#include
#include
#define MAX_NUMBER_OF_TREE_NODES 20
//树的结点的类型定义
typedef struct
{
unsigned int weight;
unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree;
//子函数的声明部分
void InitTreeNode(HTNode);
void CinWeightForTreeNode(HTNode);
void GiveOrderForTreeNode(HTNode);
void CopyTreeNodeOrTree(HTNode,HTNode);
int main()
{
//定义将要用于构造哈弗曼树的结点
HTNode TreeNodes[MAX_NUMBER_OF_TREE_NODES+1];
//调用函数初始化数组结点
InitTreeNode(TreeNodes);
//由用户输入各个结点的权值
CinWeightForTreeNode(TreeNodes);
//对数组中的结点进行排序
GiveOrderForTreeNode(TreeNodes);
return true;
}
//初始化结点值,使全部为NULL
void InitTreeNode(HTNode *treenodes)
{
int i=1
//数组的首结点用来存数一些信息,如weight域用来存储节点
//突然想到了一个好处就是:等会我们几点不断减少的过程中可以用首结点的
//weight来指示剩余结点的数目,做访问数组元素的界限
treenodes[0].weight=MAX_NUMBER_OF_TREE_NODES;
treenodes[0].lchild=NULL;
treenodes[0].parent=NULL;
treenodes[0].rchild=NULL;
for(;i<=MAX_NUMBER_OF_TREE_NODES;i++)
{
treenodes[i].weight=0;
treenodes[i].lchild=0;
treenodes[i].rchild=0;
treenodes[i].parent=0;
}
}
void CinWeightForTreeNode(HTNode *treenodes)
{
int i=1;
cout<<"请输入每个结点的权值:"< for(;i<=MAX_NUMBER_TREE_NODES;i++) cout<<"第"< cin>>treenodes[i].weight; } } void GiveOrderForTreeNode(HTNode *treenodes) { HTNode TemporarySave; //CopyTreeNodeOrTree(treenodes[1],TemporarySave); int i=2; int count=1; int j=treenodes[0].weight; for(;i<=j;i++) { if(treenodes[count].weight>treenodes[i].weight) count=i; } CopyTreeNodeOrTree(treenodes[count],TemporarySave); for(;i { CopyTreeNodeOrTree(treenodes[i],treenodes[i+1]) } CopyTreeNodeOrTree(treenodes[weight],TemporarySave); treenodes[0].weight--; } void CopyTreeNodeOrTree(HTNode Node1,HTNode Node2) { //功能描述:用Node1的值去修改Node2的值 Node2.lchild = Node1.lchild; Node2.parent = Node1.parent; Node2.parent = Node1.rchild; Node2.weight = Node1.weight; //检测左右孩子是否为空,如果不为空,则进行再次深度复制//采用递归调用执行 if(Node1.lchild) CopyTreeNode(Node1.lchild,Node2.lchild); if(Node1.rchild) CopyTreeNode(Node1.rchild,Node2.rchild); }