社区
数据结构与算法
帖子详情
大家 谁知道哈夫曼树,求带权路径长度的算法啊??
conquersky
2006-11-08 04:35:31
如题, 着急 想不明白。。。麻烦大家了
...全文
1787
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
打赏
举报
回复
用 非递归 算法 。。。。
数据结构
哈夫曼树
教程
数据结构教程,介绍了
哈夫曼树
即带权
路径
长度
最短的二叉树
哈夫曼树
哈夫曼的编码与解码
哈夫曼树
给定N个权值作为N个叶子节点,构造一棵二叉树,若该树的带权
路径
长度
达到最小,称这样的二叉树为最优二叉树,也称为
哈夫曼树
(Huffman Tree)。
哈夫曼树
是带权
路径
长度
最短的树,权值较大的结点离根较近。 基本定义: 权:赋予节点一些属性,如数量或权重,如 A 的权重为 2。
路径
:一棵树中,一个节点到另外相邻一个节点之间的通路称为
路径
,或者边。 节点
路径
长度
:在一棵树中,从一个节点到根节点所经历的
路径
或边的数量,我们称为节点
路径
长度
,如 A 的
路径
长度
为 3。 节点的带权
路径
长度
:一棵树中,每一个节点都有自己的权重,权重*节点
路径
长度
=节点的带权
路径
长度
;如节点 A 的带权
路径
长度
= 3 * 2 = 6。 树的带权
路径
长度
:所有节点的带权
路径
长度
之和,如上述二叉树带权
路径
长度
= 2 * 3 + 1 * 3 + 3 * 2 + 1 * 3 + 1 * 3 + 2 * 2 = 25。
c++ 笔记
哈夫曼树
构造
哈夫曼树
的哈夫曼
算法
单一一个文件 单一一个文件
数据结构
哈夫曼树
PPT学习教案.pptx
数据结构
哈夫曼树
PPT学习教案.pptx
【数据结构与
算法
】
哈夫曼树
的构建方法详解:定义、构建思路及C++代码实现
内容概要:本文详细介绍了
哈夫曼树
的定义、构建思路及其代码实现。首先解释了
路径
、
路径
长度
、结点的带权
路径
长度
以及树的带权
路径
长度
等基本概念,并指出
哈夫曼树
是带权
路径
长度
最小的二叉树,也称最优二叉树。接着阐述了
哈夫曼树
的构建思路,即从给定的权值集合出发,每次选取两个权值最小的结点作为子树,生成新的父结点,直到所有结点合并为一棵树。最后给出了完整的C++代码实现,包括定义树结构、查找最小权值结点的函数以及创建
哈夫曼树
的核心逻辑; 适用人群:对数据结构有一定了解,尤其是熟悉二叉树相关概念的学习者或开发者; 使用场景及目标:①帮助读者深入理解
哈夫曼树
的概念和原理;②掌握
哈夫曼树
的具体构建方法;③通过代码实现加强对
哈夫曼树
的理解; 其他说明:本文提供了详细的代码示例,建议读者在阅读过程中尝试运行代码并理解每一步的操作,以便更好地掌握
哈夫曼树
的构建过程。
数据结构与算法
33,029
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章