北邮数据结构实验报告 联系客服

发布时间 : 星期日 文章北邮数据结构实验报告更新完毕开始阅读897193b19a89680203d8ce2f0066f5335b81676f

Node *front=p->next; if(n==0)

throw exception(\没有输入字符\ for(int i=0;i

root.data=front->count; root.lchild=-1; root.rchild=-1; root.parent=-1; front=front->next; } front=p; int New1,New2; for(i=n;i {

SelectMin(New1,New2,0,i); //从0~i中选出两个权值最小的结点

root.parent=root.parent=i; //用两个权值最小的结点生成新结点, 新节点为其双亲

root.data=root.data+root.data;//新结点的权值为其孩子的权值的和 root.lchild=New1; root.rchild=New2; root.parent=-1;

}

CreateCodeTable(p); //创建编码表 }

时间复杂度:

在选取两个权值最小的结点的函数中要遍历链表,时间复杂度为O(n),故该函数 的时间复杂度为O(n^2)

3.

(void

HuffmanTree::CreateCodeTable(Node *p)) 算法伪代码: 1.初始化编码表

2.初始化一个指针,从链表的头结点开始,遍历整个链表

将链表中指针当前所指的结点包含的字符写入编码表中

得到该结点对应的哈夫曼树的叶子结点及其双亲 如果哈夫曼树只有一个叶子结点,将其字符对应编码设置为0

如果不止一个叶子结点,从当前叶子结点开始判断 如果当前叶子结点是其双亲的左孩子,则其对应的编码为0,否 则为1

child指针指向叶子结点的双亲,parent指针指向child指针的双亲, 重复的操作

将已完成的编码倒序 取得链表中的下一个字符 3.输出编码表 源代码:

void HuffmanTree::CreateCodeTable(Node *p) {

HCodeTable=new HCode; //初始化编码表 Node *front=p->next; for(int i=0;i {

HCodeTable.data=front->character; //将第i个字符写入编码表

int child=i; //得到第i个字符对应的叶子节点 int parent=root.parent; //得到第i个字符对应的叶子节点的双亲 int k=0;

if(tSize==1) //如果文本中只有一种字符,它的编码为0 {

HCodeTable.code='0'; k++; }

while(parent!=-1) //从第i个字符对应的叶子节点开始,寻找它到根结点的路径 {

if(child==root.lchild) //如果当前结点为双亲的左孩子,则编码为0, 否则编码为1

HCodeTable.code='0'; else

HCodeTable.code='1'; k++;

child=parent; parent=root.parent; }

HCodeTable.code='';

Reverse(HCodeTable.code); //将编码逆置 front=front->next; //得到下一个字符 }

cout for(i=0;i {