社区
数据结构与算法
帖子详情
大家 谁知道哈夫曼树,求带权路径长度的算法啊??
conquersky
2006-11-08 04:35:31
如题, 着急 想不明白。。。麻烦大家了
...全文
1837
6
打赏
收藏
大家 谁知道哈夫曼树,求带权路径长度的算法啊??
如题, 着急 想不明白。。。麻烦大家了
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
6 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
bingbinggongzi260
2006-11-10
打赏
举报
回复
我不是按书上搞的
能正确编码的
#include <iostream>
#include <string>
using namespace std;
class H
{
private:
char ch;
int weight;
char Code[15];//=" ";
H * parent;
H * Lchild;
H * Rchild;
H * next;
public:
H();
void create();
void order();
void del(H * p);
void insert(H * P);
void Hcode();
void travel(H * T);
void PrintCode(H * T);
};
H * head=new H;
//////////////////////////////////////
H::H()
{
ch='0';
weight=0;
// Code[]=" ";
for(int i=0;i<15;i++)
Code[i]=' ';
Code[15]='\0';
parent=0;
Lchild=0;
Rchild=0;
next=0;
}
void H::create()
{
cout<<"输入字母及其权值:(以0,0结束)\n";
head->parent=head;
head->next=head;
char ch;
int weight;
cin>>ch;
cin>>weight;
H * p1,* p2;
p1=head;
while(ch!='0'||weight!=0)
{
p2=new H;
p2->ch=ch;
p2->weight=weight;
p1->next=p2;
p2->next=head;
p2->parent=p1;
head->parent=p2;
cin>>ch;
cin>>weight;
p1=p1->next;
}
}
void H::order()
{
bool a=false;
H * p1,* p2,* p=head->next,* temp=head;
while(p->next!=head)
{
p1=head->next;
while(p1->next!=temp)
{
p2=p1->next;
if(p1->weight>p2->weight)
{
p1->parent->next=p2;
p2->parent=p1->parent;
p1->parent=p2;
p1->next=p2->next;
p2->next->parent=p1;
p2->next=p1;
if(p1->next==head)
a=true;
if(p1==p)
p=p2;
}
else
p1=p1->next;
if(a)
{
head->parent=p1;
a=false;
}
}
p=p->next;
temp=temp->parent;
}
}
void H::insert(H * p)//插入到头结点后面,成为第一个有效节点
{
p->parent=head;
p->next=head->next;
head->next->parent=p;
head->next=p;
}
void H::Hcode()
{
H * p1,* p2,* p;
while(head->next->next!=head)
{
order();
p1=head->next;
p2=p1->next;
p=new H;
p->weight=p1->weight+p2->weight;
p1->parent=p;
p2->parent=p;
// p1->next=0;
// p2->next=0;
p->Lchild=p1;
p->Rchild=p2;
if(head->next->next->next!=head)
{
head->next=p2->next;
p2->next->parent=head;
}
else
{
head->next=head;
head->parent=head;
}
p1->next=0;
p2->next=0;
insert(p);
}
head=head->next;
head->parent=0;
}
/*void H::travel(H * T, int i,char a[])
{
if(T)
{
if((T->Lchild==0)&&(T->Rchild==0))
{
cout<<a;
a[--i]=' ';
}
a[i]='0';
i++;
// cout<<T->ch<<" "<<T->weight<<endl;
travel(T->Lchild,i,a);
a[--i]=' ';
a[++i]='1';
travel(T->Rchild,i,a);
a[i]=' ';
}
}*/
void H::travel(H * T)
{
if(T)
{
if((T->Lchild==0)&&(T->Rchild==0))
PrintCode(T);
//cout<<T->ch<<" "<<T->weight<<endl;
travel(T->Lchild);
travel(T->Rchild);
}
}
void H::PrintCode(H * T)
{
H * p;
p=T;
char a[15]=" ";
int i=0;
while(p->parent)
{
if(p==p->parent->Lchild)
a[i]='0';
else
a[i]='1';
i++;
p=p->parent;
}
for(int t=0;t<i;t++)
T->Code[t]=a[i-t-1];
cout<<T->ch<<" "<<T->Code<<endl;
}
int main()
{
H b;
b.create();
b.Hcode();
b.travel(head);
return 0;
}
//a 9 b 8 c 7 0 0
//a 1
挺拔的劲松
2006-11-10
打赏
举报
回复
http://blog.csdn.net/sdp/archive/2006/11/10/1378327.aspx
Aaron_Jerry
2006-11-10
打赏
举报
回复
随便找个数据结构书,在树那一章肯定有这个算法
conquersky
2006-11-09
打赏
举报
回复
我顶。。。。。。。。
tanglaoya321
2006-11-09
打赏
举报
回复
void Select(HuffmanTree HT,int a,int &s1,int &s2)
{
int j;int i,k;
for(i=1;i<=a;i++)
{
if(HT[i].parent==0){s1=i;break;}
}
for(j=i+1;j<=a;j++)
{
if(HT[j].parent==0){s2=j;break;}
}
for(k=1;k<=a;k++)
{
if(HT[k].parent==0&&HT[k].weight<HT[s1].weight)s1=k;
}
if(s1==s2)s2=i;
for(k=1;k<=a;k++)
{
if(HT[k].parent==0&&HT[k].weight<HT[s2].weight&&k!=s1)
s2=k;
}
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n)
{
//w存放n个字符的权值都大于0,构造赫夫曼树 ht,并求出n个字符的 赫夫曼编码hc
int m;HuffmanTree p;int i;int s2,s1;char* cd;int start,c,f;
if(n<=1)return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{
p->weight=*w;p->lchild=0;p->parent=0;p->rchild=0;
}
for(;i<=m;++i,++p)
{
p->weight=0;p->lchild=0;p->parent=0;p->rchild=0;
}
for(i=n+1;i<=m;++i)//建赫夫曼树
//在ht[]选择parent为0且 weigeht最小的两个节点,其序号为s1和s2
{
Select(HT,i-1,s1,s2);
HT[s1].parent=i;HT[s2].parent=i;
HT[i].lchild=s1;HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
conquersky
2006-11-08
打赏
举报
回复
用 非递归 算法 。。。。
哈夫曼树
(C语言实现)
文章目录
哈夫曼树
的基本概念
哈夫曼树
的构建构建思路代码实现哈夫曼编码的生成编码生成思路代码实现完整代码展示以及代码测试
哈夫曼树
的基本概念 在认识
哈夫曼树
之前,你必须
知道
以下几个基本术语: 1、什么是
路径
? 给定N个权值作为N个结点,构造一棵二叉树,若该树的带权
路径
长度
达到最小,则称该二叉树为
哈夫曼树
,也被称为最优二叉树。
哈夫曼树
的构建 构建思路 代码实现 哈夫曼编码的生成 编码生成思路 代码实现 完整代码展示以及代码测试 ...
最小堆实现
哈夫曼树
的构造及哈夫曼编码、解码
以下程序的
算法
思想主要来自于浙江大学陈越老师主编的数据结构一书。最大堆(最小堆思想差不多)这里就不再多说,这里主要讲讲
哈夫曼树
的定义及实现。 Huffman Tree 相关概念: 结点的
路径
长度
:从根结点到该结点的
路径
上分支的数目。 树的
路径
长度
:树中每个结点的
路径
长度
之和。(从树根到其余各结点的
路径
长度
之和) 结点的带权
路径
长度
(WPL):结点的
路径
长度
与该结点所带权值的乘...
求
哈夫曼树
的带权
路径
长
题目描述:
哈夫曼树
,第一行输入一个数n,表示叶结点的个数。需要用这些叶结点生成
哈夫曼树
,根据
哈夫曼树
的概念,这些结点有权值,即weight,题目需要输出所有结点的值与权值的乘积之和。 输入: 输入有多组数据。 每组第一行输入一个数n,接着输入n个叶节点(叶节点权值不超过100,2)。 输出: 输出权值。 样例输入: 5 1 2 2 5 9 样例输出: 37 来源: 2
带权
路径
长度
wpl值_
哈夫曼树
带权
路径
长度
怎么计算
哈夫曼树
的带权
路径
长度
是什么?1.树的
路径
长度
树的
路径
长度
是从树根到树中每一结点的
路径
长度
之和。在结点数目相同的二叉树中,完全二叉树的
路径
长度
最短。2.树的带权
路径
长度
(Weighted Path Length of Tree,简记为WPL)结点的权:在一些应用中,赋予树中结点的一个有某种意义的实数。结点的带权
路径
长度
:结点到树根之间的
路径
长度
与该结点上权的乘积。树的带权
路径
长度
(Weighted...
哈夫曼树
和哈夫曼编码(附完整C语言代码)
概念
哈夫曼树
,也叫最优二叉树。在含有给定的n个带权叶子结点的二叉树中,WPL最小的树。其中,结点的权指的是某种特定含义的数值;带权
路径
长度
值根到结点的
路径
长度
乘以结点权值;树的带权
路径
长度
(WPL)是指树中所有叶子结点的带权
路径
长度
之和。 构造 根据哈夫曼
算法
,叙述如下: 1.根据给定的n个权值{w1,w2,…,wn}构成的n棵二叉树集合F={T1,T2,…,Tn},其中每棵二叉树Ti中只有一个带权为wi的根结点,其左右子树均为空。 2.在F中选取两棵根结点权值最小的树作为左右子树构造一棵新的二叉树,且置
数据结构与算法
33,025
社区成员
35,334
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章