IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 哈夫曼树的建立 |还没写完 在改正 -> 正文阅读

[数据结构与算法]哈夫曼树的建立 |还没写完 在改正

存储结构:?

class node{
    public:
        int weight; 权值域,保存该节点的权值
        int lchild; 指针域,结点的左孩子在数组中的下标
        int rchild; 指针域 结点的右孩子在数组中的下标
        int parent; 指针域,该节点的双亲结点在数组中的下标
}

性质:

在构建哈夫曼树的过程,只有出度为0和2的结点,

在二叉树中 n0 = n2 + 1? ------》? n2 = n0-1? 代入下面公式

因此n=n0+n2 = n0+(n0-1) = 2*n0 -1? 所以创建数组大小为2*n0 -1大小的数组

哈夫曼树的创建:

1. 数组huffTree初始化,所有元素结点的双亲,左孩子,右孩子都设置为-1;

2.数组huffTree的前n个元素的权值给定值w[n];

3.进行n-1次合并, (当有3个元素是需要合并两次)所以要合并n-1次

??????? 3.1 在二叉树集合中选取两个权值最小的根节点,权值最小结点其下标分别为i1,i2;

??????? 3.2 将二叉树i1,i2合并为一棵新的二叉树k

创建哈夫曼树代码

void huffTree(node huffTree[], int w[], int n){
    int i1,i2;
    for(int i=0; i<n; i++){  //初始化所有结点的双亲,左孩子,右孩子域为-1;
        huffTree[i].parent = -1;
        huffTree[i].lchild = -1;
        huffTree[i].rchild = -1;
    }
    
    for(int i=0; i<n; i++){
        huffTree[i].weight = w[i];  //给哈夫曼树的结点赋予权值
    }
    
    for(int k=n; k<2*n-1; k++){
        select(huffTree[], k, i1,i2);  //找到parent为-1的最小和次小结点
        huff[k].weight = huffTree[i1].weight + huffTree[i2].weight;
        huffTree[i1].parent = k;  //更新要i1结点和i2结点的双亲域
        huffTree[i2].parent = k;
        huffTree[k].lchild = i1;  //把双亲结点的左右孩子域更新
        huffTree[k].rchild = i2;
    }

}

?说一下找最小值的思路:

首先设置一个较大的元素,之后遍历数组,当数组中的元素比这个元素小的时候,就让数组中的元素等于这个元素并记录该元素下标.? 对于哈夫曼树还要满足一个条件就是parent域必须是-1;

为什么定义较大的元素,因为当这个元素很小比如是2,输入arr[3]={5,6,7},则比较最小值时候,数组中没有一个数值比最小值还小,最终不能交换,导致查到的最小值是自己设置的值,而不是数组中的值。

找次小值的思路:

首先定义一个较大的值secmin,之后遍历数组,对于哈夫曼树有一个条件就是parent域为-1,用数组中的每一个元素和这个最小值作比较,但是数组中的元素不能是之前循环判断的最小的那个元素,怎么判断不是最小的那个呢,在找最小值的时候已经记录了最小值的下标,这次让判断时候,除了要求数组元素小于secmin,并且让这次访问的数组下标不等于最小值的下标就好了.

void select(node huffTree[], int k,int n, int &i1, int &i2){
	
	int min_data = 6666, secmin_data = 6666;   
    //设置大点,如果小了,数组中的元素都没有min_data小,则就进不去数组中选择元素
	
    int min_loc,secmin_loc; //用来记录最小值的位置
	//找到最小的结点 
	for(int i=0; i<k; i++){
		if(huffTree[i].parent == -1){
			if(huffTree[i].weight <= min_data){
				min_data = huffTree[i].weight;
				min_loc = i;
			}
		}
	}
	
    //找到次小的结点 
    //已经记录了最小结点的下标为s1,所以这次找最小的下标,
    //但是条件是下标不能为标记的s1;就是次小结点
	for(int i=0; i<k; i++){
		if(huffTree[i].parent == -1){
			if(huffTree[i].weight <= secmin_data && i != min_loc ){
				secmin_data = huffTree[i].weight;
				secmin_loc = i ;
		}

	}
}
	
	i1 = min_loc;
	i2 = secmin_loc;
	
    //用于验证是否i1和i2是最小和次小的
	cout<<"select 第"<<k-n+1<<" 次i1="<<i1<<" i2="<<i2<<endl;
	
}

?哈夫曼树创建完成。

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-10-17 12:14:11  更:2021-10-17 12:15:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:39:26-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码