创建哈夫曼树并求带权路径长度

article/2025/10/2 11:35:16

创建哈夫曼树并求带权路径长度

【问题描述】根据给定的权重,构造哈夫曼树,输出其带权路径长度。
【输入形式】输入权重,空格作为分隔,回车结束,权重个数小于10。
【输出形式】哈夫曼树的带权路径长度。
【样例输入】5 6 2 9 7
【样例输出】65
【样例说明】
【评分标准】

#include<iostream>
#include<cstdlib>
#include<cstdio>
#define MAX_SIZE 10
#define MAX 100
using namespace std;
typedef struct
{int weight;int parent, lchild, rchild;
}HTNode, *HuffmanTree;
void Select(HuffmanTree HT, int k, int &s1, int &s2)       //在HT[1...i-1]中选择parent为0,且weight最小的两个结点,分别赋给s1,s2
{int i, min;min = MAX;for (i = 1; i <= k; i++){if (HT[i].parent == 0 && min > HT[i].weight){s1 = i;min = HT[i].weight;}}min = MAX;for (i = 1; i <= k; i++){if (i != s1 && HT[i].parent == 0 && HT[i].weight < min){s2 = i;min = HT[i].weight;}}
}
void CreateHuffmanTree(HuffmanTree &HT, int *w, int n)     //创建哈夫曼树,不求哈夫曼编码HC
{int m, i, s1, s2;if (n <= 1)return;m = 2 * n - 1;HT = new HTNode[m + 1];for (i = 1; i <= m; i++){HT[i].weight = i <= n ? w[i - 1] : 0;HT[i].parent = HT[i].lchild = HT[i].rchild = 0;}s1 = s2 = 0;for (i = n + 1; i <= m; i++)                           //建哈夫曼树{Select(HT, i - 1, s1, s2);HT[i].lchild = s1;HT[i].rchild = s2;HT[s1].parent = HT[s2].parent = i;HT[i].weight = HT[s1].weight + HT[s2].weight;}
}
void PrintHuffmanTree(HuffmanTree HT, int n)
{int m, i;m = 2 * n - 1;for (i = 1; i <= m; i++){cout << i << "   " << HT[i].weight << "   " << HT[i].parent << "   " << HT[i].lchild << "   " << HT[i].rchild << endl;}
}
int WeightedPathLength(HuffmanTree HT, int n)              //求带权路径的长度
{int len, i, k, t;len = t = 0;for (i = 1; i <= n; i++){                                                      //哈夫曼树的特性决定:每一个双亲必有左右孩子,根节点除外for (k = HT[i].parent, t = 0; k != 0; k = HT[k].parent)                          //到根节点结束,即求出了路径长度t++;len += HT[i].weight*t;}return len;
}
int main(void)
{int n, len, w[MAX_SIZE];HuffmanTree HT;n = 0;do                                                     //输入权重,按回车结束{cin >> w[n];n++;} while (getchar() != '\n');CreateHuffmanTree(HT, w, n);len = WeightedPathLength(HT, n);cout << len << endl;system("pause");return 0;
}

用例二叉树:
该例二叉树
存储结构:
存储结构
运行案例:
运行案例
说明:
1.在哈夫曼树的构造过程中,需要频繁地访问结点的双亲,故采用静态三叉链表。
2.n个叶子结点的哈夫曼树,结点总数是确定的,共有2n-1个结点。
3.哈夫曼树上只含有度为0和度为2的结点,不存在度为1的结点。
4.构造n个权值的哈夫曼树,共需进新n-1次合并。


http://chatgpt.dhexx.cn/article/MtUxZ68W.shtml

相关文章

哈夫曼树(构建以及计算加权路径长度)

今天做远景的笔试题&#xff0c;遇到了这么一道题&#xff0c;求{11,8,6,5,2}构成的哈夫曼树的加权路径长度。 好长时间没看数据结构&#xff0c;居然忘记怎么求了&#xff0c;该死。 考完下百度&#xff0c;好多答案居然都是错的。或者是光有答案没有过程。在这里把哈夫曼树的…

哈夫曼树的构建、编码以及带权路径长计算

给定n个权值作为n个叶子结点&#xff0c;构造一棵二叉树&#xff0c;若该树的带权路径长度达到最小&#xff0c;称这样的二叉树为最优二叉树&#xff0c;也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树&#xff0c;权值较大的结点离根较近。 构造哈夫曼树的算…

哈夫曼树与带权路径长度

问题&#xff1a; 权值分别为从19&#xff0c;21&#xff0c;2&#xff0c;3&#xff0c;6&#xff0c;7&#xff0c;10&#xff0c;32的结点&#xff0c;构造一棵哈夫曼树&#xff0c;该树的带权路径长度是&#xff1f; 哈夫曼树的一个应用&#xff1a; 压缩字符串https://…

哈夫曼树 和 树的带权路径长度

树的带权路径长度(Weighted Path Length of Tree)&#xff1a;定义为树中所有叶结点的带权路径长度之和。 结点的带权路径长度&#xff1a;结点到树根之间的路径长度与该结点上权的乘积。 哈夫曼树是一种带权路径长度最短的二叉树&#xff0c;也称为最优二叉树。 哈夫曼树构建…

哈夫曼树的带权路径长度的算法

计算方法&#xff1a; ①先对集合中的结点按照权值从小到大排。 ②选两个权值最小的结点&#xff0c;将它们的权值相加构成一个新结点&#xff0c;原来的这两个最小的结点是新结点的左右子结点。 ③在有序集合中将两个被加过的结点去掉&#xff0c;再把新的结点放入集合中排…

哈夫曼树结构和带权路径长度计算

什么是哈夫曼树呢&#xff1f; 哈夫曼树是一种带权路径长度最短的二叉树&#xff0c;也称为最优二叉树。下面用一幅图来说明。 它们的带权路径长度分别为&#xff1a; 图a&#xff1a; WPL5*27*22*213*254 图b&#xff1a; WPL5*32*37*213*148 可见&#xff0c;图b的带权路径长…

哈夫曼树结构及带权路径长度

哈夫曼树&#xff1a; 当用 n 个结点&#xff08;都做叶子结点且都有各自的权值&#xff09;试图构建一棵树时&#xff0c;如果构建的这棵树的带权路径长度最小&#xff0c;称这棵树为“最优二叉树”&#xff0c;有时也叫“赫夫曼树”或者“哈夫曼树”。 在构建哈弗曼树时&…

哈弗曼树的带权路径长度

最近刷题刷到了这一题&#xff0c;此题是北邮往年复试题&#xff0c;看了一些网上的讲解&#xff0c;大多数是方法比较复杂&#xff0c;有些巧妙的方法又往往却缺少解释&#xff0c;为了方便大家理解&#xff0c;给小伙伴们梳理梳理 题目描述&#xff1a; 哈夫曼树&#xff0…

哈夫曼树带权路径长度

一. 长什么样&#xff1f; 左边是普通树&#xff0c;右边是哈夫曼树 图a&#xff1a; WPL5*27*22*213*254 图b&#xff1a; WPL5*32*37*213*148 可见&#xff0c;图b的带权路径长度较小&#xff0c;我们可以证明图b就是哈夫曼树(也称为最优二叉树)。 二. 怎么生成和计算&…

哈夫曼树、带权路径长度、前缀编码 的概念

文章目录 一、基本概念1.1带权路径长度&#xff08;WPL&#xff09;1.2哈夫曼树 二、哈夫曼树的构造三、哈夫曼树的应用3.1哈夫曼编码与前缀编码 一、基本概念 1.1带权路径长度&#xff08;WPL&#xff09; 路径长度&#xff1a; 经历的边数 结点的带权路径长度&#xff1a; …

树学习(2)

1、 一颗哈夫曼树的带权路径长度等于其中所有分支结点的权值之和。&#xff08;错误&#xff09; 分析&#xff1a; 树的带权路径长度&#xff1a;定义为树中所有叶结点的带权路径长度之和&#xff1b;&#xff08;即等于所有结点&#xff08;叶结点分支结点&#xff0…

哈夫曼树 带权路径

树的带权路径长度 &#xff08;Weighted Path Length of Tree&#xff0c;简记为WPL&#xff09; 一般的&#xff0c;我们是可以用常规的构造哈夫曼树求带权路径长度。 计算结点的带权路径长度&#xff1a;结点到树根之间的路径长度与该结点上权的乘积。 带权路径长度WPL&a…

求Huffman树的带权路径长度

Huffman树的建立过程&#xff1a; 首先得到整个叶子结点的集合&#xff1a; 求Huffman树的带权路径长度算法&#xff1a; 书上讲常见的求Huffman树的带权路径长度算法为&#xff1a;从叶子结点权值乘路径长度&#xff1a; WPL7*25*25*23*32*349 另外一种求WPL的算法为&…

运行startx报错的解决

CentOS启动图形界面startx&#xff1a;xauth: file /root/.serverauth.1164 does not exist 运行如下命令 yum update yum groupinstall "X Window System" yum groupinstall "Desktop"报错无法解决问题. 继续运行如下命令 yum grouplist看到了一行: …

linux startx xinit

startx启动过程分析 startx 及xinit 介绍(经典) startx启动过程 startx用法&#xff1a; startx [ [ client ] options ... ] [ -- [ server ] [ display ] options ... ]startx三种启动方式&#xff1a; 1 指定client和server&#xff0c; 例如&#xff1a;startx /usr/bin…

startx 及xinit 介绍(经典)

X-server管理鼠标、键盘、显卡、显示器 X-client处理程序的运行 ---------------------------------------------------------------------------------------------------- WM管理窗口&#xff1a;移动、变型、关闭、装饰...... --------------------------------------------…

startx 及xinit 介绍

X-server管理鼠标、键盘、显卡、显示器X-client处理程序的运行----------------------------------------------------------------------------------------------------WM管理窗口&#xff1a;移动、变型、关闭、装饰......------------------------------------------------…

linux startx无效_startx命令_Linux startx 命令用法详解:用来启动X Window

startx命令用来启动X Window&#xff0c;实际上启动X Window的程序为xinit。 语法startx(参数) 参数客户端及选项&#xff1a;X客户端及选项&#xff1b; 服务器及选项&#xff1a;X服务器及选项。 实例 要在工作站上或 X 终端上启动 X 会话&#xff0c;请输入&#xff1a;star…

ubuntu 启动、退出 startx界面

使用的是ubuntu-focal 20.04 桌面版。因为在熟悉使用ubuntu出现这个问题。 启动startx 1、首先要了解ubuntu几种运行级&#xff08;参考init_百度百科&#xff09;&#xff0c;ubuntu桌面版默认启动的是init 5 &#xff1a;如下的正常登录界面。 2、进入和从terminal中输入s…

操作系统 - startx/xinit

了解startx/xinit 1.概述 用户可以通过 xinit 程序手动启动 Xorg 显示服务器&#xff0c;startx脚本是 xinit 的前端。 xinit 通常用在启动 X 时执行窗口管理器 或 桌面环境。虽然可以使用 xinit 在无窗口管理器的情况下启动图形程序&#xff0c;大部分图形程序都需要一个兼容…