问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

数据结构 哈夫曼树在构造时 有顺序要求吗 比如左右子树的顺序要固定什么的 必须谁左谁右之类的 ?

发布网友 发布时间:2022-04-29 05:25

我来回答

3个回答

热心网友 时间:2023-10-12 22:11

Huffman树构造时,两个孩子原则上是没有左右之分的,当然,如果是考试,可能会约定左右子树的大小的。

节点按照权值排序的规则,例如两个原始节点或者一个原始节点和一个新建节点,具有相同的权值时,需要统一序列中的前后顺序(序列中的前后顺序也就是确定哪个是左子节点和右子节点),目的仍然是满足构造出的哈夫曼树具有相同的结构#include<stdio.h>

#include<iostream>

#define INF 0x3f3f3f3f

#define MALL (Bithrnode *)malloc(sizeof(Bithrnode));

typedef struct

{

int weight;

int parent, lchild, rchild;

}HTNode, *Huffmantree;

void Select(Huffmantree HT, int n, int &x1, int &x2)// 查找前n个结点的最小权值的下标下x1、x2;

{

int min1 = INF;

int min2 = INF;

for(int i=1; i<=n; ++i)

int m = 2*n-1;

for(int i=1; i<=2*n-1; ++i)

cout << "结点序号 " << i;

cout << " 权重 " << HT[i].weight;

cout << " parent " << HT[i].parent;

cout << " Lchild " << HT[i].lchild;

cout << " Rchild " << HT[i].rchild << '\n';

int main()

{

Huffmantree HT;

cout << "开始构建哈夫曼树" << '\n';

cout << "请输入哈夫曼树的叶子结点的个数: ";

int n;

cin >> n;

cout << "请输入每个叶子结点的权值: " << '\n';

CreatHuffmantree(HT, n);

print(HT, n);

return 0;

}

扩展资料:

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:

(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林;

(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

参考资料来源:百度百科-哈夫曼树

热心网友 时间:2023-10-12 22:12

1、我们可以统一确定左子节点和右子节点的大小关系,例如所有构造都必须使得左子节点的权值不小于右子节点,免得给出相同的原始节点序列,所构造的哈夫曼树结构不同
2、节点按照权值排序的规则,例如两个原始节点或者一个原始节点和一个新建节点,具有相同的权值时,需要统一序列中的前后顺序(序列中的前后顺序也就是确定哪个是左子节点和右子节点),目的仍然是满足构造出的哈夫曼树具有相同的结构#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<math.h>
using namespace std ;
typedef long long ll;
#define MAXN 100005
#define INF 0x3f3f3f3f
#define MALL (Bithrnode *)malloc(sizeof(Bithrnode));

typedef struct
{
int weight;
int parent, lchild, rchild;
}HTNode, *Huffmantree;

void Select(Huffmantree HT, int n, int &x1, int &x2)// 查找前n个结点的最小权值的下标下x1、x2;
{
int min1 = INF;
int min2 = INF;
for(int i=1; i<=n; ++i)
{
if(HT[i].parent == 0 && min1 > HT[i].weight)
{
min1 = HT[i].weight;
x1 = i;
}
}
for(int i=1; i<=n; ++i)
{
if(HT[i].parent == 0 && min2 > HT[i].weight && i!=x1)
{
min2 = HT[i].weight;
x2 = i;
}
}
}

void CreatHuffmantree(Huffmantree &HT, int n)//顺序创建哈夫曼树
{
if(n<=1)
return;
int m = 2*n-1;
HT = (HTNode *)malloc(2*n*sizeof(HTNode));//创建2*n个空间,因为0没有被用到。。。。

for(int i=1; i<=2*n-1; ++i)
{
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
for(int i=1; i<=n; ++i)
scanf("%d", &HT[i].weight); // 初始化完成

int s1, s2;
for(int i=n+1; i<=2*n-1; ++i)
{
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;
}
}

void print(Huffmantree HT, int n)
{
for(int i=1; i<=2*n-1; ++i)
{
cout << "结点序号 " << i;
cout << " 权重 " << HT[i].weight;
cout << " parent " << HT[i].parent;
cout << " Lchild " << HT[i].lchild;
cout << " Rchild " << HT[i].rchild << '\n';
}
}

int main()
{
Huffmantree HT;

cout << "开始构建哈夫曼树" << '\n';
cout << "请输入哈夫曼树的叶子结点的个数: ";
int n;
cin >> n;
cout << "请输入每个叶子结点的权值: " << '\n';
CreatHuffmantree(HT, n);
print(HT, n);
return 0;
}

热心网友 时间:2023-10-12 22:12

Huffman树构造时,两个孩子原则上是没有左右之分的,当然,如果是考试,可能会约定左右子树的大小的

热心网友 时间:2023-10-12 22:11

Huffman树构造时,两个孩子原则上是没有左右之分的,当然,如果是考试,可能会约定左右子树的大小的。

节点按照权值排序的规则,例如两个原始节点或者一个原始节点和一个新建节点,具有相同的权值时,需要统一序列中的前后顺序(序列中的前后顺序也就是确定哪个是左子节点和右子节点),目的仍然是满足构造出的哈夫曼树具有相同的结构#include<stdio.h>

#include<iostream>

#define INF 0x3f3f3f3f

#define MALL (Bithrnode *)malloc(sizeof(Bithrnode));

typedef struct

{

int weight;

int parent, lchild, rchild;

}HTNode, *Huffmantree;

void Select(Huffmantree HT, int n, int &x1, int &x2)// 查找前n个结点的最小权值的下标下x1、x2;

{

int min1 = INF;

int min2 = INF;

for(int i=1; i<=n; ++i)

int m = 2*n-1;

for(int i=1; i<=2*n-1; ++i)

cout << "结点序号 " << i;

cout << " 权重 " << HT[i].weight;

cout << " parent " << HT[i].parent;

cout << " Lchild " << HT[i].lchild;

cout << " Rchild " << HT[i].rchild << '\n';

int main()

{

Huffmantree HT;

cout << "开始构建哈夫曼树" << '\n';

cout << "请输入哈夫曼树的叶子结点的个数: ";

int n;

cin >> n;

cout << "请输入每个叶子结点的权值: " << '\n';

CreatHuffmantree(HT, n);

print(HT, n);

return 0;

}

扩展资料:

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:

(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林;

(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

参考资料来源:百度百科-哈夫曼树

热心网友 时间:2023-10-12 22:11

Huffman树构造时,两个孩子原则上是没有左右之分的,当然,如果是考试,可能会约定左右子树的大小的。

节点按照权值排序的规则,例如两个原始节点或者一个原始节点和一个新建节点,具有相同的权值时,需要统一序列中的前后顺序(序列中的前后顺序也就是确定哪个是左子节点和右子节点),目的仍然是满足构造出的哈夫曼树具有相同的结构#include<stdio.h>

#include<iostream>

#define INF 0x3f3f3f3f

#define MALL (Bithrnode *)malloc(sizeof(Bithrnode));

typedef struct

{

int weight;

int parent, lchild, rchild;

}HTNode, *Huffmantree;

void Select(Huffmantree HT, int n, int &x1, int &x2)// 查找前n个结点的最小权值的下标下x1、x2;

{

int min1 = INF;

int min2 = INF;

for(int i=1; i<=n; ++i)

int m = 2*n-1;

for(int i=1; i<=2*n-1; ++i)

cout << "结点序号 " << i;

cout << " 权重 " << HT[i].weight;

cout << " parent " << HT[i].parent;

cout << " Lchild " << HT[i].lchild;

cout << " Rchild " << HT[i].rchild << '\n';

int main()

{

Huffmantree HT;

cout << "开始构建哈夫曼树" << '\n';

cout << "请输入哈夫曼树的叶子结点的个数: ";

int n;

cin >> n;

cout << "请输入每个叶子结点的权值: " << '\n';

CreatHuffmantree(HT, n);

print(HT, n);

return 0;

}

扩展资料:

假设有n个权值,则构造出的哈夫曼树有n个叶子结点。 n个权值分别设为 w1、w2、…、wn,则哈夫曼树的构造规则为:

(1) 将w1、w2、…,wn看成是有n 棵树的森林(每棵树仅有一个结点);

(2) 在森林中选出两个根结点的权值最小的树合并,作为一棵新树的左、右子树,且新树的根结点权值为其左、右子树根结点权值之和;

(3)从森林中删除选取的两棵树,并将新树加入森林;

(4)重复(2)、(3)步,直到森林中只剩一棵树为止,该树即为所求得的哈夫曼树。

参考资料来源:百度百科-哈夫曼树

热心网友 时间:2023-10-12 22:12

1、我们可以统一确定左子节点和右子节点的大小关系,例如所有构造都必须使得左子节点的权值不小于右子节点,免得给出相同的原始节点序列,所构造的哈夫曼树结构不同
2、节点按照权值排序的规则,例如两个原始节点或者一个原始节点和一个新建节点,具有相同的权值时,需要统一序列中的前后顺序(序列中的前后顺序也就是确定哪个是左子节点和右子节点),目的仍然是满足构造出的哈夫曼树具有相同的结构#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<math.h>
using namespace std ;
typedef long long ll;
#define MAXN 100005
#define INF 0x3f3f3f3f
#define MALL (Bithrnode *)malloc(sizeof(Bithrnode));

typedef struct
{
int weight;
int parent, lchild, rchild;
}HTNode, *Huffmantree;

void Select(Huffmantree HT, int n, int &x1, int &x2)// 查找前n个结点的最小权值的下标下x1、x2;
{
int min1 = INF;
int min2 = INF;
for(int i=1; i<=n; ++i)
{
if(HT[i].parent == 0 && min1 > HT[i].weight)
{
min1 = HT[i].weight;
x1 = i;
}
}
for(int i=1; i<=n; ++i)
{
if(HT[i].parent == 0 && min2 > HT[i].weight && i!=x1)
{
min2 = HT[i].weight;
x2 = i;
}
}
}

void CreatHuffmantree(Huffmantree &HT, int n)//顺序创建哈夫曼树
{
if(n<=1)
return;
int m = 2*n-1;
HT = (HTNode *)malloc(2*n*sizeof(HTNode));//创建2*n个空间,因为0没有被用到。。。。

for(int i=1; i<=2*n-1; ++i)
{
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
for(int i=1; i<=n; ++i)
scanf("%d", &HT[i].weight); // 初始化完成

int s1, s2;
for(int i=n+1; i<=2*n-1; ++i)
{
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;
}
}

void print(Huffmantree HT, int n)
{
for(int i=1; i<=2*n-1; ++i)
{
cout << "结点序号 " << i;
cout << " 权重 " << HT[i].weight;
cout << " parent " << HT[i].parent;
cout << " Lchild " << HT[i].lchild;
cout << " Rchild " << HT[i].rchild << '\n';
}
}

int main()
{
Huffmantree HT;

cout << "开始构建哈夫曼树" << '\n';
cout << "请输入哈夫曼树的叶子结点的个数: ";
int n;
cin >> n;
cout << "请输入每个叶子结点的权值: " << '\n';
CreatHuffmantree(HT, n);
print(HT, n);
return 0;
}

热心网友 时间:2023-10-12 22:12

Huffman树构造时,两个孩子原则上是没有左右之分的,当然,如果是考试,可能会约定左右子树的大小的

热心网友 时间:2023-10-12 22:12

1、我们可以统一确定左子节点和右子节点的大小关系,例如所有构造都必须使得左子节点的权值不小于右子节点,免得给出相同的原始节点序列,所构造的哈夫曼树结构不同
2、节点按照权值排序的规则,例如两个原始节点或者一个原始节点和一个新建节点,具有相同的权值时,需要统一序列中的前后顺序(序列中的前后顺序也就是确定哪个是左子节点和右子节点),目的仍然是满足构造出的哈夫曼树具有相同的结构#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<math.h>
using namespace std ;
typedef long long ll;
#define MAXN 100005
#define INF 0x3f3f3f3f
#define MALL (Bithrnode *)malloc(sizeof(Bithrnode));

typedef struct
{
int weight;
int parent, lchild, rchild;
}HTNode, *Huffmantree;

void Select(Huffmantree HT, int n, int &x1, int &x2)// 查找前n个结点的最小权值的下标下x1、x2;
{
int min1 = INF;
int min2 = INF;
for(int i=1; i<=n; ++i)
{
if(HT[i].parent == 0 && min1 > HT[i].weight)
{
min1 = HT[i].weight;
x1 = i;
}
}
for(int i=1; i<=n; ++i)
{
if(HT[i].parent == 0 && min2 > HT[i].weight && i!=x1)
{
min2 = HT[i].weight;
x2 = i;
}
}
}

void CreatHuffmantree(Huffmantree &HT, int n)//顺序创建哈夫曼树
{
if(n<=1)
return;
int m = 2*n-1;
HT = (HTNode *)malloc(2*n*sizeof(HTNode));//创建2*n个空间,因为0没有被用到。。。。

for(int i=1; i<=2*n-1; ++i)
{
HT[i].parent = 0;
HT[i].lchild = 0;
HT[i].rchild = 0;
}
for(int i=1; i<=n; ++i)
scanf("%d", &HT[i].weight); // 初始化完成

int s1, s2;
for(int i=n+1; i<=2*n-1; ++i)
{
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;
}
}

void print(Huffmantree HT, int n)
{
for(int i=1; i<=2*n-1; ++i)
{
cout << "结点序号 " << i;
cout << " 权重 " << HT[i].weight;
cout << " parent " << HT[i].parent;
cout << " Lchild " << HT[i].lchild;
cout << " Rchild " << HT[i].rchild << '\n';
}
}

int main()
{
Huffmantree HT;

cout << "开始构建哈夫曼树" << '\n';
cout << "请输入哈夫曼树的叶子结点的个数: ";
int n;
cin >> n;
cout << "请输入每个叶子结点的权值: " << '\n';
CreatHuffmantree(HT, n);
print(HT, n);
return 0;
}

热心网友 时间:2023-10-12 22:12

Huffman树构造时,两个孩子原则上是没有左右之分的,当然,如果是考试,可能会约定左右子树的大小的
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 数据结构赫夫曼树的左右子树问题。 右手的劲为什么一般比左手的劲大? 左边口子右边子字是什么字 左边一个妾字右边一个子字念什么 右子家婴童服装厂在哪里 左边口,右边子,念什么? 向水中投右子为什么会有水柱向上跳? 左月右子念什么 小右就是樱井右子吗 右子左浪是什么成语 黑帮盛世里右子的真实身份 哪几个银行的信用卡好? 樱井右子的资料 一般拥有几张信用卡比较好 左子关系表示父子、右子关系表示兄弟(高分求解) 信用卡几张最好? 右子牌子码子偏大吗 请问一下右子可以组什么词? 信用卡办几张最好? 信用卡几张为好 民康中医院是治颈肩腰腿痛的专科医院。10月25日中华中医药学会疼痛分会副主任委员--毛书歌教授亲诊。 毛书歌教授常用什么膏药治腰腿痛病?是麝香蝮蛇膏吗? 头晕,胸闷五年,各项检查都是阴性,查不出原因,怀疑神经官能症,寰枢关节半脱位压迫神经 长春市办理民办职业培训机构变更需要什么材料? 什么是利息?什么是本钱? 什么是“利息”? 利息是什么意思啊 什么是利息?该怎样计算利息? 7.2利息是什么意思 WPS出入尾注之后,为什么后面的内容从大纲视图里显示不出来了? win7开机以后没有图标,任务管理器也打不开 用有魅力的语言,在水塘边、草坪边、花坛边、点灯开关旁写个提示牌 公园草坪上常有爱心提示牌:“请勿践踏,爱护我”。经常践踏草坪会造成土壤板结,从而影响草的生长。对此 请你为学校草坪上友情提示牌写一句话,提醒同学们保护草坪,爱护绿化(急急急急)! 田径场的温馨提示牌是从哪个机关发过来的 请你为学校草坪上的友情提示牌,写一句话,提醒同学们要保护草坪,爱护绿化。 求学霸帮忙 求黑莓手机的功能详解? 四 请你为学校草坪上的警示牌写一条标语,提醒大家爱护草坪,但不能直接使用“爱护”“禁止”等类似的词语 请你为学校草坪警示牌拟一条标语,提醒同学们爱护草坪(要注意语言的得体)。__________________________ 公园小溪边的提示牌上写着:“溪水感言:我的清澈亮丽离不开你的呵护。”请照样子写出草地旁提示牌上的“