哈夫曼树算法如下

(1)根据给定的n个权值,使对应节点构成n棵二叉树的森林,其中每棵二叉树都只有一个根节点,其左右子树均为空。
(2)在森林中选取两棵节点权值最小的子树分别作为左右子树构造一棵新的二叉树,且置新的二叉树的根节点的权值为其左右子树上根节点的权值之和。
(3)在森林中,用新得到的二叉树替代选取的两棵树。
(4)重复(2)和(3),直到只含有一棵树为止,这棵树便是哈夫曼树。

构造过程图如下:

测试分析

为了便于操作,使用数组存放二叉树,并用一个HTNode存放节点,数组下标为【0~n-1】的位置存放用来构造哈夫曼树的节点(此例中存放的是权重域为1,3,5,7这4个节点),一共将要用到数组的【0】到【2n-1】(不包括【2n-1】)个节点(因为有n个叶子节点且只有二度节点的二叉树的节点数为2*n-1)。按照构造过程图可知,输出结果应为:1 3 5 7 4 9 16.

C++代码实现

头文件及类定义:

#include<iostream>
using namespace std;#define MaxSize 20typedef struct {char data;            //节点值double  weight;        //权重int parent;         //双亲节点int lchild;           //左孩子节点int rchild;          //右孩子节点
}HTNode;

构造哈夫曼树的算法:

void CreateHT(HTNode ht[],int n){int i, j, k;int lnode, rnode;//lnode存放最小权值节点的位置,rnode存放权值次小节点位置double min1, min2;//min1存放最小权值,min2存放次小权值for (i = 0; i < 2 * n - 1; i++)//初始化所有相关节点域为-1ht[i].parent = ht[i].lchild = ht[i].rchild = -1;//第一层循环,第一次遍历[0]到[n-1]个元素(所有待构造的节点存放在这段区间)//每次循环会产生一个新的节点,所以每次循环结束后i++,for (i = n; i < 2 * n - 1; i++) {min1 = min2 = 32767;//初始化lnode = rnode = -1;//初始化//第二层循环,第一次遍历[0]到[n-1]个元素找到两个最小权值节点并以此构造新节点,插入到末尾for (k = 0; k <= i - 1; k++) {if (ht[k].parent == -1) {//只在尚未构造二叉树的节点中查找if (ht[k].weight < min1) {//当k点权值小于保存最小权值的点的值时min2 = min1;rnode = lnode;//将最小权值点赋值给次小权值点min1 = ht[k].weight;lnode = k;//将k点赋值为最小权值点}else if (ht[k].weight < min2) {//当k点权值大于min1,小于min2时min2 = ht[k].weight;rnode = k;}}}//用两个最小节点创建新节点,该新节点将在下一次循环参与比较ht[i].weight = ht[lnode].weight + ht[rnode].weight;//为新节点设置权值ht[i].lchild = lnode;//设置其左右孩子节点ht[i].rchild = rnode;ht[lnode].parent = i;//设置当前两最小节点的双亲节点ht[rnode].parent = i;}}

主函数测试及运行结果:

int main() {HTNode ht[MaxSize];HTNode node1;HTNode node2;HTNode node3;HTNode node4;node1.weight = 1;node2.weight = 3;node3.weight = 5;node4.weight = 7;ht[0] = node1;ht[1] = node2;ht[2] = node3;ht[3] = node4;CreateHT(ht, 4);for (int i = 0; i < 2 * 4 - 1; i++)cout << ht[i].weight << " ";cout << endl;}

数据结构教程—哈夫曼树的构造算法相关推荐

  1. 哈夫曼树的构造算法代码

    代码: #include<stdio.h> #define ERROR 0 #define OK 1 typedef int Status; //采用顺序存储结构,一维结构数组 //定义结 ...

  2. 数据结构“基于哈夫曼树的数据压缩算法”的实验报告

    一个不知名大学生,江湖人称菜狗 original author: jacky Li Email : 3435673055@qq.com Last edited: 2022.11.20 目录 数据结构& ...

  3. 数据结构 基于哈夫曼树的数据压缩算法

    数据结构 基于哈夫曼树的数据压缩算法 实验目的 实验内容 实验提示 实验代码 实验小结 实验目的 1.掌握哈夫曼树的构造算法. 2.掌握哈夫曼编码的构造算法. 实验内容 问题描述 输入一串字符串,根据 ...

  4. 数据结构学习记录——哈夫曼树(什么是哈夫曼树、哈夫曼树的定义、哈夫曼树的构造、哈夫曼树的特点、哈夫曼编码)

    目录 什么是哈夫曼树 哈夫曼树的定义 哈夫曼树的构造 图解操作 代码实现 代码解析 哈夫曼树的特点 哈夫曼编码 不等长编码 二叉树用于编码 哈夫曼编码实例 什么是哈夫曼树 我们先举个例子: 要将百分制 ...

  5. 【数据结构】哈夫曼树与哈夫曼编码

    定义 带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带有权值wkw_kwk​,从根节点到每个叶子结点的长度为lkl_klk​,则每个叶子结点的带权路径长度之和就是:WPLWPLWPL=∑ ...

  6. 数据结构(哈夫曼树+KMP)之 数据加密+解密

    数据结构(哈夫曼树+KMP)之 数据加密+解密 原理:参考趣学数据结构 代码: #include<stdio.h> #include<stdlib.h> #define N 1 ...

  7. 哈夫曼树的构造及C++代码实现

    哈夫曼树的构造过程: (1) 以权值分别为W1,W2...Wn的n各结点,构成n棵二叉树T1,T2,...Tn并组成森林F={T1,T2,...Tn},其中每棵二叉树 Ti仅有一个权值为 Wi的根结点 ...

  8. 哈夫曼树的构造(C语言实现)

    哈夫曼树的构造过程可以详见推荐博客:哈夫曼树以及哈夫曼编码的构造步骤 建议先看完推荐博客中的文字说明,或者自己找一本数据结构的树来仔细阅读以下关于哈夫曼树的构造 然后再来看下面给出的code 这里给出 ...

  9. 赫夫曼树编码的算法及应用习题--数据结构

    赫夫曼树编码的算法及应用习题 1.构造赫夫曼树的方法 1.根据给定的n个权值{w1,w2,---wn},构成n棵二叉树的集合F={T1,T2...,Tn},其中每棵二叉树中只有一个带权为Wi的根结点, ...

最新文章

  1. 践行科技向善,腾讯Light 把光引向厦门
  2. 豪掷十亿拿下CUBA运营权,阿里体育未来也许并不轻松
  3. SpringCloud动态刷新配置信息
  4. AtomicInteger源码注释
  5. vfp 右键发送邮件_邮件批量发送的方法教程
  6. 【语法解释】init
  7. u-boot移植重要问题说明
  8. 如梦如幻,开源实时的天空特效算法!
  9. 算法学习(三)堆排序
  10. 微信小程序开发(十五)小程序使用scrollview实现滚动导航栏
  11. 新手怎么创建域名?创建域名后怎么样建站?
  12. C语言中关键字typedef、enum的使用
  13. EIGRP优化—末节路由简介
  14. Web前端开发入门教程,HTML5+CSS3+JS教程,达到web前端工程师的水平
  15. 人工神经元算法视频教学,人工智能神经网络算法
  16. 测绘程序设计实习 CSU
  17. 西行漫记(14):慌神了
  18. 千万不要招实习生啊!!!!
  19. java招投标管理系统的区别_建设项目招投标信息管理系统的设计与开发
  20. 香侬科技:打造出有中国文化特色的全球技术领先人工智能公司 | 百万人学AI评选

热门文章

  1. 解决跨域问题(详解9种方法)
  2. 【工具下载】软件下载汇总
  3. hexedit(1) - Linux man page
  4. Java 元婴期-架构师成长路线
  5. 趣味题:求两个日期之间的相隔天数
  6. 2015多校第一场 1005 hdu 5292 Pocket Cube 转魔方
  7. Object转map方法
  8. 手机+ip查询归属地
  9. 赠书福利丨你意想不到的个人隐私数据泄露
  10. 黑客季昕华——从技术宅到创业英雄的五个故事