哈夫曼算法建立最优二叉树

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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);

}

相关文档
最新文档