收藏 分享(赏)

第06章 特殊二叉树.ppt

上传人:jinchen 文档编号:9862768 上传时间:2019-09-12 格式:PPT 页数:53 大小:1.05MB
下载 相关 举报
第06章  特殊二叉树.ppt_第1页
第1页 / 共53页
第06章  特殊二叉树.ppt_第2页
第2页 / 共53页
第06章  特殊二叉树.ppt_第3页
第3页 / 共53页
第06章  特殊二叉树.ppt_第4页
第4页 / 共53页
第06章  特殊二叉树.ppt_第5页
第5页 / 共53页
点击查看更多>>
资源描述

1、第6章 特殊二叉树,数据结构与算法 Data Structures and Algorithms,6.1 二叉搜索树(Binany Searching Tree),6.1.1 二叉搜索树的定义,二叉搜索树又称做二叉排序树,它或者是一棵空树,或者是一棵具有如下特性的非空二叉树:(1) 若它的左子树非空,则左子树上所有结点的关键字均小于树根结点的关键字;(2) 若它的右子树非空,则右子树上所有结点的关键字均大于树根结点的关键字;(3) 左、右子树本身又各是一棵二叉搜索树。,数据结构与算法 Data Structures and Algorithms,12,15,18,23,26,30,52,63,

2、74,对二叉搜索树进行中序遍历得到的结点序列必然是一个有序序列。,中序遍历:,数据结构与算法 Data Structures and Algorithms,6.1.2 二叉搜索树的抽象数据类型,数据部分:是一棵二叉搜索树,它可以具有同一般二叉树一样的任何存储结构。,操作部分:除了已经讨论过的对一般二叉树的操作外,还具有对二叉搜索树的一些常用操作,即查找、更新、插入和删除元素的操作。,数据结构与算法 Data Structures and Algorithms,假定二叉搜索树中的结点类型为BTreeNode结构类型,指向二叉搜索树的树根结点的指针为BST,则对二叉搜索树BST的查找、更新、插入和

3、删除元素的操作声明如下:,bool Delete(BTreeNode*,bool Find(BTreeNode* BST, ElemType,bool Update(BTreeNode*,void Insert(BTreeNode*,数据结构与算法 Data Structures and Algorithms,6.1.3 二叉搜索树的运算,1. 查找算法,bool Find(BTreeNode* BST, ElemType,数据结构与算法 Data Structures and Algorithms,bool Find1(BTreeNode* BST, ElemType,查找运算的非递归算法如

4、下:,数据结构与算法 Data Structures and Algorithms,2. 更新算法(非递归算法),bool Update1(BTreeNode* BST, const ElemType /没有待更新的结点,返回假,数据结构与算法 Data Structures and Algorithms,3. 插入算法(递归算法),void Insert(BTreeNode*,数据结构与算法 Data Structures and Algorithms,void Insert1(BTreeNode*,插入过程的非递归算法具体描述如下:,数据结构与算法 Data Structures and

5、Algorithms,4. 建立二叉搜索树的算法,void CreateBSTree(BTreeNode*,数据结构与算法 Data Structures and Algorithms,假定待建立二叉搜索树的一组元素的关键字为:38,26,62,94,35,50,28,55,数据结构与算法 Data Structures and Algorithms,5. 删除算法,从二叉搜索树上删除结点可能删除的是叶子结点,也可能删除的是分支结点,当删除分支结点时,就破坏了原有结点之间的链接关系,需要重新修改指针,使得删除后仍为一棵二叉搜索树。,数据结构与算法 Data Structures and Alg

6、orithms,假设二叉搜索树如下:,数据结构与算法 Data Structures and Algorithms,只要将其双亲结点链接到它的指针去掉(即置为空)即可。,(1) 删除叶子结点,数据结构与算法 Data Structures and Algorithms,删除该结点时,只要将它的唯一一个后继指针链接到它所在的链接位置即可。,(2) 删除单支结点,数据结构与算法 Data Structures and Algorithms,第1种方法:首先把它的右子树链接到它的中序前驱结点的右指针域,然后把它的左子树链接到它所在的链接位置。,L,D,A,G,F,M,S,W,P,D,A,G,F,(3

7、) 删除双支结点,数据结构与算法 Data Structures and Algorithms,L,D,A,G,F,M,S,W,P,L,D,A,M,S,W,P,数据结构与算法 Data Structures and Algorithms,第2种方法:首先把它的中序前驱结点的值赋给该结点的值域,然后再删除它的中序前驱结点,因为它的中序前驱结点的右指针为空,所以只要把中序前驱结点的左指针链接到中序前驱结点所在的链接位置即可。,L,D,A,G,F,M,S,W,P,L,D,A,G,M,S,W,P,数据结构与算法 Data Structures and Algorithms,L,D,A,G,F,M,S,

8、W,P,L,D,G,F,M,S,W,P,数据结构与算法 Data Structures and Algorithms,bool Delete(BTreeNode*,从二叉搜索树中删除结点的递归算法如下:,数据结构与算法 Data Structures and Algorithms,6.2 堆,6.2.1 堆的定义,堆(Heap)分为小根堆和大根堆两种,对于一个小根堆,它是具有如下特性的一棵完全二叉树。(1) 若树根结点存在左孩子,则树根结点的值小于等于左孩子结点的值;(2) 若树根结点存在右孩子,则树根结点的值小于等于右孩子结点的值;(3) 以左、右孩子为根的子树又同样各是一个堆。大根堆的定义

9、与上述类似,只要把小于等于改为大于等于就得到了。,数据结构与算法 Data Structures and Algorithms,堆顶结点,即整个完全二叉树的根结点,对于小根堆来说具有最小值,对于大根堆来说具有最大值。,数据结构与算法 Data Structures and Algorithms,6.2.2 堆的抽象数据类型,堆的抽象数据类型中的数据部分是按任一种存储结构表示的堆,假定用标识符HBT表示,其存储类型用标识符HeapType表示;堆的抽象数据类型中的操作部分通常为:向堆中插入一个元素,从堆中删除堆顶元素,初始化一个堆,清除一个堆,判断一个堆是否为空等。下面给出堆的抽象数据类型的具体

10、定义:,数据结构与算法 Data Structures and Algorithms,ADT HEAP isData:具有HeapType类型的一个堆HBTOperations:void InitHeap(HeapType/从堆中删除堆顶元素并返回end HEAP,数据结构与算法 Data Structures and Algorithms,6.2.3 堆的存储结构,堆既可采用顺序存储,也可采用链接存储。但由于堆是一棵完全二叉树,所以适宜采用顺序存储,这样能够充分利用其存储空间。对堆进行顺序存储时,首先要对堆中的所有结点进行编号,然后再以编号为下标存储到指定数组的对应元素中。为了利用数组的0号

11、元素,让堆中结点的编号从0而不是从1 开始,当然编号次序仍然按照从上到下、同一层从左到右进行,若堆中含有n个结点,则编号范围为0n-1。,数据结构与算法 Data Structures and Algorithms,让堆中的结点从0开始编号后,编号为0至 n/2-1的结点为分支结点,编号为 n/2 至n-1的结点为叶子结点;当n为奇数则每个分支结点既有左孩子又有右孩子,当n为偶数则编号最大的一个分支结点只有左孩子没有右孩子;对于每个编号为i的分支结点,其左孩子结点的编号为2i+1,右孩子结点的编号为2i+2;除编号为0的堆顶结点外,对于其余编号为i的结点,其双亲结点的编号为 (i-1)/2。,

12、数据结构与算法 Data Structures and Algorithms,0 1 2 3 4 5 6 7 8 9,0 1 2 3 4 5 6 7 8 9,数据结构与算法 Data Structures and Algorithms,struct Heap ElemType* heap; /定义指向动态数组空间的指针int len; /定义保存堆长度的变量int MaxSize; /用于保存初始化时所给的动态数组空间的大小;,定义堆的顺序存储类型,数据结构与算法 Data Structures and Algorithms,6.2.4 堆的运算,下面给出在堆的抽象数据类型中列出的每一种操作的

13、具体算法描述,对于插入和删除算法将以小根堆为例给出。,数据结构与算法 Data Structures and Algorithms,void InitHeap(Heap ,1初始化堆,数据结构与算法 Data Structures and Algorithms,void ClearHeap(Heap,2清除堆,数据结构与算法 Data Structures and Algorithms,bool EmptyHeap(Heap,3检查一个堆是否为空,数据结构与算法 Data Structures and Algorithms,4向堆中插入一个元素,向堆中插入一个元素时,首先将该元素写入到堆尾,即

14、堆中最后一个元素的后面,亦即下标为len的位置上,然后经调整为一个新堆。由于在原有堆上插入一个新元素后,可能使以该元素的双亲结点为根的子树不为堆,从而使整个树不为堆,所以必须进行调整使之仍为一个堆。,数据结构与算法 Data Structures and Algorithms,调整的方法:若新元素小于双亲结点的值,就让它们互换位置;新元素换到双亲位置后,使得以该位置为根的子树成为堆,但新元素可能还小于此位置的双亲结点的值,从而使以上一层的双亲结点为根的子树不为堆,还需要按上述方法继续调整,这样持续传递上去,直到以新位置的双亲结点为根的子树仍为一个堆或者调整到堆顶为止,此时得到的整个树又成为了一

15、个堆。,数据结构与算法 Data Structures and Algorithms,分别插入一个新元素50,30 ,15 。,数据结构与算法 Data Structures and Algorithms,void InsertHeap(Heap,向堆中插入一个元素的算法描述为:,数据结构与算法 Data Structures and Algorithms,5从堆中删除元素,从堆中删除元素就是删除堆顶元素并使之返回。堆顶元素被删除后,留下的堆顶位置应由堆尾元素来填补,这样既保持了顺序存储结构又不需要移动其他任何元素。把堆尾元素移动到堆顶位置后,它可能不小于左、右孩子结点,使整个二叉树不为堆,所

16、以需要一个调整过程,使之变为含有n-1个元素的堆(假定删除前为n个元素)。,数据结构与算法 Data Structures and Algorithms,调整方法:首先从树根结点开始,若树根结点的值大于两个孩子结点中的最小值,就将它与具有最小值的孩子结点互换位置,使得根结点的值小于两个孩子结点的值;原树根结点被对调到一个孩子位置后,可能使以该位置为根的子树又不为堆,因而又需要使新元素向孩子一层调整,如此调整下去,直到以调整后的位置为根的子树成为一个堆或调整到叶子结点为止。,数据结构与算法 Data Structures and Algorithms,若从中删除顶点元素18时,需要把堆尾元素60

17、写入到堆顶位置成为堆顶元素,由于60大于两个孩子中的最小值26,所以应互换60和26的位置,60被移到新位置后,又大于两个孩子中的最小值48,所以接着同48互换位置,此时60已被调整到叶子结点,所以调整完成,得到的完全二叉树又成为一个堆。,思考:若为45呢?,数据结构与算法 Data Structures and Algorithms,从堆中删除元素的算法描述为:,ElemType DeleteHeap(Heap ,数据结构与算法 Data Structures and Algorithms,6.3 哈夫曼树,6.3.1 基本术语,1. 路径和路径长度,在一棵树中存在着一个结点序列k1,k2,

18、.,kj,使得ki是ki+1的双亲,则称此结点序列是从k1kj的路径。从k1kj所经过的分支数称为这两点之间的路径长度,它等于路径上的结点数减1。,数据结构与算法 Data Structures and Algorithms,2. 结点的权和带权路径长度,结点的带权路径长度为从树根结点到该结点之间的路径长度与该结点上权的乘积。,3. 树的带权路径长度,树的带权路径长度为树中所有叶子结点的带权路径长度之和。记为:,数据结构与算法 Data Structures and Algorithms,数据结构与算法 Data Structures and Algorithms,数据结构与算法 Data S

19、tructures and Algorithms,数据结构与算法 Data Structures and Algorithms,4. 哈夫曼树(Huffman Tree),哈夫曼树又称作最优二叉树。它是n个带权叶子结点构成的所有二叉树中,带权路径长度WPL最小的二叉树。权值越大的结点离树根越近。,数据结构与算法 Data Structures and Algorithms,6.3.2 构造哈夫曼树,d,b,c,6,9,2,5,4,a,b,d,c,9,4,5,2,a,b,9,4,a,d,b,2,4,9,a,c,5,d,b,2,4,6,11,数据结构与算法 Data Structures and

20、Algorithms,ElemType WeightPathLength(BTreeNode* FBT, int len)if(FBT=NULL) return 0; /空树则返回0else if(FBT-left=NULL ,下面给出根据哈夫曼树求出带权路径长度的算法。,数据结构与算法 Data Structures and Algorithms,6.3.3 哈夫曼编码,若电文中只使用A,B,C,D,E,F这6个字符,进行等长编码需要二进制的三位,可以依次编码为:,最简单的二进制编码方式是等长编码。,可以将上面编码表示成编码二叉树如下:,000,001,010,011,100,101,数据结

21、构与算法 Data Structures and Algorithms,若在一份电文中,这六个字符出现的频率依次为:4,2,6,8,3,2,则编码后的总长度为:,数据结构与算法 Data Structures and Algorithms,如何缩短传送电文的总长度,从而节省传送时间呢?,采用不等长编码,无前缀编码:若对某一字符集进行不等长编码,则要求字符集中任一字符的编码都不能是其他字符编码的前缀。,数据结构与算法 Data Structures and Algorithms,0,1,1,1,1,1,0,0,0,0,4,7,15,25,10,2,2,3,8,6,4,A:00 B:1010 C:01 D:11 E:100 F:1011,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报