树和二叉树(四).

Slides:



Advertisements
Similar presentations
二叉树在树结构的应用中起着非常重要的作用,因为对二叉树的许多操作算法简单,而任何树都可以与二叉树 相互转换,这样就解决了树的
Advertisements

Chapter 06 Tree and binary tree 第六章 树和二叉树
第6章 二叉树和树 前面的章节主要讨论的是线性结构,二叉树和树属于非线性的结构。遍历非线性结构比线性结构要麻烦。
主讲:计算机工程学院 李兰 答疑地点:主教学楼B区213
数据结构学习考 复习课(2) 主要内容: 第三部分:树、二叉树、森林.
第6章 树和二叉树 树型结构是一类非常重要的非线性结构。直观地,树型结构是以分支关系定义的层次结构。
助教:李伟力 电子科学与技术系 数据结构第二次习题课 助教:李伟力 电子科学与技术系
实用数据结构基础 第6章 树.
第六章 树和二叉树.
算法设计与分析 授课教师:王秋芬 办公地点:7307
第6章 树 数据结构(C++描述).
第6章 树和二叉树 (Tree & Binary Tree)
CH6 树和二叉树 6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林
数据结构与算法 Data Structure Algorithms
数据结构 第六章 树与二叉树 深圳大学计算机系 蔡茂国.
第六章 二叉树和树 6.1 二叉树 6.2 二叉树的基本操作与存储实现 6.3 二叉树的遍历 6.4 线索二叉树 6.5 树和森林
第六章 树和森林 1、树、森林的概念 2、二叉树及其表示 3、遍历二叉树和线索二叉树 4、堆 5、树和森林 6、二叉树的计数 7、霍夫曼树
第6章 树与二叉树.
树.
数据结构 第6章 树和二叉树 什么是树和二叉树?? 二叉树的遍历 数据结构.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
树(三) 2012初赛知识点梳理.
第六章 树和二叉树 6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林 6.6 赫夫曼树及其应用.
第五章 树及二叉树 1.树的定义和术语 2.二叉树:定义、性质、存储 3.二叉树的遍历 4. 二叉树遍历的迭代器类 *5. 中序穿线树 6. 最优二叉树及其应用 7. 树和森林.
Chapter 5 Tree & Binary Tree
第6章 树和二叉树 6.1 树的有关概念 6.2 二叉树 6.3 二叉树的遍历 6.4 遍历的应用 6.5 线索二叉树 6.6 树和森林
第六章 树和二叉树.
赵海燕 软件研究所 14 Apr 第5章 树与二叉树 之三 赵海燕 软件研究所 14 Apr
第五章 树与二叉树 树和森林的概念 二叉树 二叉树遍历 线索化二叉树 树与森林 堆 Huffman树.
Chapter9 Priority Trees
树和二叉树(三).
数 据 结 构 Ch.6 树 计 算 机 学 院 肖明军
Ch.6 树
二叉树 二叉树 遍历 递归.
第六章 树与二叉树 6.1 树的定义和基本术语 6.2 二叉树 6.3 遍历二叉树和线索二叉树 6.4 树和森林
湖北大学知行学院 教师:涂晓帆 Sunday, December 09, 2018
第六章 树和二叉树.
第8章 树和二叉树 树 二叉树 二叉树设计 二叉树遍历 线索二叉树 哈夫曼树 等价问题 树与二叉树的转换 树的遍历 主要知识点.
教 师:曾晓东 电 话: E_mail: 计算机软件技术基础 教 师:曾晓东 电 话: E_mail:
第5章 树和二叉树 北京师范大学 教育技术学院 杨开城.
数据结构 Data Structure 主讲人:王国军,郑瑾 CSU 中南大学信息院计科系
第5章 树和二叉树 5.1树 5.2二叉树 5.3二叉树的遍历 5.4线索二叉树 5.5树、森林与二叉树的转换 5.6哈夫曼树.
数据结构 Data Structure 主讲人:王国军,郑瑾 CSU 中南大学信息院计科系
第11讲 树和二叉树(二).
第六章 树 2019/1/14.
第六章 树与森林 树和森林的概念 二叉树 (Binary Tree) 二叉树的表示
第五章 树 5.1 树的定义 树是一类重要的非线性数据结构,是以分支关系定义的层次结构 定义
数据结构概论 第6章 树和二叉树 董黎刚 浙江工商大学信电学院.
6.6 Huffman树及其应用 王 玲.
Tree & Binary Tree.
Tree & Binary Tree.
无向树和根树.
本节内容 字符编码 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
第六章 树和二叉树 £6.1 树 £6.2 二叉树 £6. 3 二叉树的存储结构 £6.4 二叉树的遍历与线索化 £6.1.1 树的定义
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
线段的有关计算.
顺序表的删除.
第六章 树和二叉树 学习要点 理解树的定义和基本术语,重点了解二叉树的定义、性质、存储结构; 掌握二叉树遍历的递归算法及它的典型运算;
第六章 树和二叉树.
第六章 二叉树和树 6.1二叉树 6.2二叉树遍历 6.3树和森林 6.4树的应用.
第5节 树 前两章学习的栈和队列属于线性结构。在这种结构中,数据元素的逻辑位置之间呈线性关系,每一个数据元素通常只有一个前件(除第一个元素外)和一个后件(除最后一个元素外)。在实际生活中,可以用线性结构描述数据元素之间逻辑关系的问题是很广泛的,但也有很多问题不能依靠线性结构来解决,例如家谱、行政组织机构等都是非线性的数据结构。其中树就是一种非线性的数据结构。
树和图 tree and graph 蔡亚星.
第七、八次实验要求.
树和二叉树(四).
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第七章 搜索结构 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
2019年9月11日星期三 离散  数学 计算机学院 冯伟森 2019年9月11日星期三.
本节内容 1. 平衡二叉树的定义 2.平衡化旋转 3.平衡二叉排序树的插入操作 昆山爱达人信息技术有限公司
最小生成树 最优二叉树.
第五章 树和二叉树.
Presentation transcript:

树和二叉树(四)

内容回顾 树的存储方式 孩子兄弟表示法 树与二叉树的转换 树转二叉树 二叉树还原为树

本节内容 1 哈夫曼树的相关概念 2.哈夫曼树的构造算法 3.判定树 (哈夫曼树的应用之一) 4.哈夫曼编码(哈夫曼树的应用之二) 5.建立哈夫曼树及求哈夫曼编码的算法

1 哈夫曼树的相关概念 A B C D E F G 1)路径和路径长度 若一棵树中存在一个结点序列k1,k2,…,kj,使得ki是kj的双亲(0<i<j),则称此结点序列是从ki~ kj的路径。从k1~kj所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1。

2)结点的权和带权路径长度 例:结点c的路径长度为2,其WPL=2*9=18 a c b d 7 3 9 8

3)树的带权路径长度 树中所有叶子结点的带权路径长度之和。通常记为: 其中 n 表示叶子结点的数目,wi 和 li分别表示叶子结点ki的权值和根到ki之间的路径长度。 a c b d 7 3 9 8

4)哈夫曼(Huffman)树 又称最优二叉树。它是 n 个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树。 例:有四个叶子结点a,b,c,d,分别带权为9、4、5、2,由它们构成三棵不同的二叉树。

a b c a) WPL=9×2 +4×2+5×2+2×2=40 b) WPL=4×1+2×2+5×3+9×3=50 d 4 9 5 2 b c d a 4 9 5 2 a b c d 9 2 4 5 a b c a) WPL=9×2 +4×2+5×2+2×2=40 b) WPL=4×1+2×2+5×3+9×3=50 c) WPL=9×1+5×2+4×3+2×3=37 Huffman树

3) 从F中删去这两棵树,同时加入刚生成的新树; 4) 重复(2)和(3)两步,直至F中只含一棵树为止。 2.哈夫曼树的构造算法 构造Huffman树的基本思想: 权值大的结点用短路径,权值小的结点用长路径。 构造Huffman树的步骤(即Huffman算法): 1)根据给定的n个权值{w1, w2, …, wn},构造 n棵二叉树的集合 F = {T1, T2, …,Tn},其中每棵二叉树中均只含一个带权值为wi的根结点,其左、右子树为空树; 2) 在F中选取其根结点的权值为最小的两棵二叉树,分别作为左、右子树构造一棵新的二叉树,并置这棵新的二叉树根结点的权值为其左、右子树根结点的权值之和; 3) 从F中删去这两棵树,同时加入刚生成的新树; 4) 重复(2)和(3)两步,直至F中只含一棵树为止。

第一步: 第二步: 第三步: 第四步: 注:方框表示外结点(叶子) 圆框表示内结点(合并后的结点)。 a b c d 9 2 5 4 a c 6 第二步: a b c d 9 2 4 5 第三步: 6 11 第四步: a 9 b c d 2 4 5 6 11 20 注:方框表示外结点(叶子) 圆框表示内结点(合并后的结点)。

3.判定树 (哈夫曼树的应用之一) 在解决某些判定问题时,利用哈夫曼树可以得到最佳判定算法。 例:编制一将学生百分成绩按分数段分级的程序。 若学生成绩分布是 均匀的,可用图(a) 二叉树结构来实现。 a<60 a<70 a<80 a<90 不及格 中等 良好 优秀 及格 Y N (a)

学生成绩分布不是均匀的情况: 输入10000个数据,则需进行31500次比较。 分数 0—59 60—69 70—79 80—89 90—99 比例 0.05 0.15 0.4 0.3 0.1 a<60 a<70 a<80 a<90 不及格 中等 良好 优秀 及格 Y N (a) 输入10000个数据,则需进行31500次比较。 500*1+1500*2+4000*3+3000*4+1000*4=31500

有没有一种更好的办法来减少比较次数呢?

以比例数为权构造一棵哈夫曼树,如(b)判断树所示。 分数 0—59 60—69 70—79 80—89 90—99 比例 0.05 0.15 0.4 0.3 0.1 70≤a<80 a<60 及格 中等 良好 80≤a<90 60≤a<70 不及格 优秀 Y N 以比例数为权构造一棵哈夫曼树,如(b)判断树所示。 再将每一比较框的两次比较改为一次,可得到(c)判定树。 输入10000个数据,仅需进行22000次比较。 不及格 Y a<90 a<80 a<70 a<60 优秀 中等 及格 良好 N (c) (b)

4.哈夫曼编码(哈夫曼树的应用之二) 二进制编码 通信中,可以采用0、1的不同排列来表示不同的字符,称为二进制编码。 发送端需要将电文中的字符序列转换成二进制的0、1序列,即编码; 接受端需要把接受的0、1序列转换成对应的字符序列,即译码。

ABACCDA 字符的两种不同的编码方案 字符 编码 字符 编码 A 000 A 00 B 010 B 01 C 100 C 10 (1) 等长编码 ABACCDA 字符的两种不同的编码方案   字符 编码 字符 编码 A 000 A 00 B 010 B 01 C 100 C 10 D 111 D 11 (a) (b) (a)电文的代码为000010000100100111000,长度为21 (b)代码为00010010101100,长度为14

ABACCDA 字符 编码 A 0 B 00 C 1 D 01 (2) 不等长编码 (2) 不等长编码 ABACCDA 字符 编码 A 0 B 00 C 1 D 01 电文用二进制序列:000011010发送,其长度只有9个二进制位

哈夫曼树编码 例:要传输的电文是{CAS;CAT;SAT;AT} 要传输的字符集是 D={C,A,S,T, ;} 每个字符出现的频率是W={ 2,4, 2,3, 3 } 方法: (1)用{ 2,4, 2,3, 3 }作为叶子结点的权值生成一棵哈夫曼树,并将对应权值wi的叶子结点注明对应的字符; (2)约定左分支表示字符“0”,右分支表示字符‘1’ (3)从根结点到叶子结点的路径上的‘0’或‘1’连接的序列就是结点对应的字符的二进制编码。 各字符编码是 T ; A C S       00 01 10 110 111 上述电文编码: 11010111011101000011111000011000 14 6 8 3 4 2 1 T ; A C S 例2:哈夫曼树用于电文编码 要传输的电文是{CAS;CAT;SAT;AT} 要传输的字符集是 D={C,A,S,T, ;} 每个字符出现的频率是W={ 2,4, 2,3, 3 } 以带权字符为叶子结点建立哈夫曼树,得到各字符编码是 T ; A C S 00       01 10 110 111 上述电文编码:11010111011101000011111000011000 其总长度为32,恰好等于哈夫曼树的带权路径长。可见哈夫曼编码是使电文具有最短长度的二进制编码。 注意:编码的总长度恰好为哈夫曼树的带权路径长。

5.建立哈夫曼树及求哈夫曼编码的算法 哈夫曼树没有度为1的结点,则一棵有n个叶子结点的哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中。 由于在构造哈夫曼树之后,为求编码需从叶子结点出发走一条从叶子到根的路径;而为译码需从根出发走一条从根到叶子的路径。所以,每个结点既需知道双亲的信息,又需知道孩子结点的信息。 typedef struct { unsigned int weight; unsigned int parent,lchild,rchild; } HTNode, *HuffmanTree; //动态分配数组存储哈夫曼树 typedef char **HuffmanCode;

//存放树的叶子结点,n-1个单元存放内部结点 for (p=HT, i=1; i<=n; ++i,++p,++w) void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w, int n) {//w存放n个字符的权值,构造哈夫曼树HT,并求出n个字符的哈夫曼编码HC if (n<=1) return; // n为字符数目, m=2*n-1; // m为结点数目 HT = (HuffmanTree)malloc((m+1)*sizeof(HTNode)); //HT存放Huffman树结构,0号单元未用,其余前n个单元 //存放树的叶子结点,n-1个单元存放内部结点 for (p=HT, i=1; i<=n; ++i,++p,++w) { p->weight = *w; p->parent=0; p->lchild=0; p->rchild=0; } // *p={*w,0,0,0};初始化HT中的叶结点循环退出时i=n+1;

for (; i<=m;++i,++p) { p->weight = 0; p->parent=0; p->lchild=0; p->rchild=0; } // *p={0,0,0,0}; 初始化HT中的内部结点 for (i=n+1; i<=m;++i) // 建哈夫曼树,(建立HT链表中的链) { Select(HT,i-1,s1,s2);//在HT[1~i-1]中选择parent // 为0且weight最小的两个结点,序号分别为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; }

//从叶子到根逆向求哈夫曼编码 HC= (HuffmanCode)malloc((n+1)*sizeof(char *)); cd = (char *)malloc( n * sizeof(char) ); cd[n-1]=‘\0’; //编码结束符 for (i=1;i<=n;++i) //逐个字符求哈夫曼编码 { start = n-1; //编码结束符位置 for (c=i,f=HT[c].parent; f!=0; c=f,f=HT[f].parent) //从叶子到根逆向求编码 if (HT[f].lchild ==c) cd[--start]='0'; else cd[--start]='1'; HC[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); //从cd复制编码串到HC printf("%s\n",HC[i]); } free(cd); //释放工作空间 } //HuffanCoding

例: 已知某系统在通信联络中只可能出现八种字符,其概率分别为0. 05,0. 29,0. 07,0. 08,0. 14,0. 23,0 例: 已知某系统在通信联络中只可能出现八种字符,其概率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计Huffman编码。 设权w=(5,29,7,8,14,23,3,11),n=8,则m=15 存储结构的初始状态为: 11 3 23 14 8 7 29 5 weight parent lchild rchild 1 2 4 6 9 10 12 13 15 14 13 100 12 2 0(15) 58 11 6 42 10 5 0(14) 29 9 8 0(13) 19 × 4 3 0(12) 15 × 7 1 0(11) 8 × 11 × 0(9) 3 × 23 × 14 × 0(10) 7 × 5× weight parent lchild rchild 15

HC 1 2 3 4 5 6 7 8 0 1 1 0 1 0 1 1 1 0 1 1 1 1 1 1 0 0 0 0 1 1 1 0 1 0 1 1 1 23 29 1 1 11 14 1 1 5 3 7 8 cd \0

小结:哈夫曼树及其应用 1.Huffman算法的思路: —权值大的结点用短路径,权值小的结点用长路径。

本章小结 1、定义和性质 2、存储结构 3、遍历 树 顺序结构 链式结构 森林 先序遍历 中序遍历 后序遍历 哈夫曼树 哈夫曼编码 二叉链表 三叉链表 森林 二叉树 中序遍历 后序遍历 先序遍历 3、遍历 哈夫曼树 哈夫曼编码

作业 1. 以数据集{4,5,6,7,10,12,18}为结点权值,画出Huffman树,并计算其带权路径长度。