#include#include#include#include#defineMAX_NUMBER_OF_TREE_NODES20//树的结点的类型定义typedefstruct{unsignedintweight;unsignedintparent,lchild,rchild;}HTNode,*HuffmanTree;//子函数的声明部分voidInitTreeNode(HTNode);voidCinWeightForTreeNode(HTNode);voidGiveOrderForTreeNode(HTNode);voidCopyTreeNodeOrTree(HTNode,HTNode);intmain(){//定义将要用于构造哈弗曼树的结点HTNodeTreeNodes[MAX_NUMBER_OF_TREE_NODES+1];//调用函数初始化数组结点InitTreeNode(TreeNodes);//由用户输入各个结点的权值CinWeightForTreeNode(TreeNodes);//对数组中的结点进行排序GiveOrderForTreeNode(TreeNodes);returntrue;}//初始化结点值,使全部为NULLvoidInitTreeNode(HTNode*treenodes){inti=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;}}voidCinWeightForTreeNode(HTNode*treenodes){inti=1;cout<<"请输入每个结点的权值:"<>treenodes[i].weight;}}voidGiveOrderForTreeNode(HTNode*treenodes){HTNodeTemporarySave;//CopyTreeNodeOrTree(treenodes[1],TemporarySave);inti=2;intcount=1;intj=treenodes[0].weight;for(;i<=j;i++){if(treenodes[count].weight>treenodes[i].weight)count=i;}CopyTreeNodeOrTree(treenodes[count],TemporarySave);for(;i