2023年自学考试数据结构重点总结02331整理.doc

上传人:可****阿 文档编号:58271938 上传时间:2022-11-07 格式:DOC 页数:28 大小:1.61MB
返回 下载 相关 举报
2023年自学考试数据结构重点总结02331整理.doc_第1页
第1页 / 共28页
2023年自学考试数据结构重点总结02331整理.doc_第2页
第2页 / 共28页
点击查看更多>>
资源描述

《2023年自学考试数据结构重点总结02331整理.doc》由会员分享,可在线阅读,更多相关《2023年自学考试数据结构重点总结02331整理.doc(28页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、自考数据结构重点(2023整理)第一章 概论1.瑞士计算机科学家沃思提出:算法+数据结构=程序。算法是对数据运算的描述,而数据结构涉及逻辑结构和存储结构。由此可见,程序设计的实质是针对实际问题选择一种好的数据结构和设计一个好的算法,而好的算法在很大限度上取决于描述实际问题的数据结构。2.数据是信息的载体。数据元素是数据的基本单位。一个数据元素可以由若干个数据项组成,数据项是具有独立含义的最小标记单位。数据对象是具有相同性质的数据元素的集合。3.数据结构指的是数据元素之间的互相关系,即数据的组织形式。数据结构一般涉及以下三方面内容:数据的逻辑结构、数据的存储结构、数据的运算数据的逻辑结构是从逻辑

2、关系上描述数据,与数据元素的存储结构无关,是独立于计算机的。数据的逻辑结构分类: 线性结构和非线性结构数据元素及其关系在计算机内的存储方式,称为数据的存储结构(物理结构)。数据的存储结构是逻辑结构用计算机语言的实现,它依赖于计算机语言。数据的运算。最常用的检索、插入、删除、更新、排序等。4.数据的四种基本存储方法: 顺序存储、链接存储、索引存储、散列存储(1)顺序存储:通常借助程序设计语言的数组描述。(2)链接存储:通常借助于程序语言的指针来描述。(3)索引存储:索引表由若干索引项组成。关键字是能唯一标记一个元素的一个或多个数据项的组合。(4)散列存储:该方法的基本思想是:根据元素的关键字直接

3、计算出该元素的存储地址。5.算法必须满足5个准则:输入,0个或多个数据作为输入;输出,产生一个或多个输出;有穷性,算法执行有限步后结束;拟定性,每一条指令的含义都明确;可行性,算法是可行的。算法与程序的区别:程序必须依赖于计算机程序语言,而一个算法可用自然语言、计算机程序语言、数学语言或约定的符号语言来描述。目前常用的描述算法语言有两类:类Pascal和类C。6.评价算法的优劣:算法的对的性是一方面要考虑的。此外,重要考虑如下三点: 执行算法所花费的时间,即时间复杂性; 执行算法所花费的存储空间,重要是辅助空间,即空间复杂性; 算法应易于理解、易于编程,易于调试等,即可读性和可操作性。以上几点

4、最重要的是时间复杂性,时间复杂度常用渐进时间复杂度表达。7.算法求解问题的输入量称为问题的规模,用一个正整数n表达。8.常见的时间复杂度按数量级递增排列依次为:常数阶0(1)、对数阶0(log2n)、线性阶0(n)、线性对数阶0(nlog2n)、平方阶0(n2)立方阶0(n3)、k次方阶0(nk)、指数阶0(2n)和阶乘阶0(n!)。9.一个算法的空间复杂度S(n)定义为该算法所花费的存储空间,它是问题规模n的函数,它涉及存储算法自身所占的存储空间、算法的输入输出数据所占的存储空间和算法在运营过程中临时占用的存储空间。第二章 线性表1.数据的运算是定义在逻辑结构上的,而运算的具体实现是在存储结

5、构上进行的。2.只要拟定了线性表存储的起始位置,线性表中任意一个元素都可随机存取,所以顺序表是一种随机存取结构。3.常见的线性表的基本运算:(1)置空表InitList(L) 构造一个空的线性表L。(2)求表长ListLength(L)求线性表L中的结点个数,即求表长。(3)GetNode(L,i) 取线性表L中的第i个元素。(4)LocateNode(L,x)在L中查找第一个值为x 的元素,并返回该元素在L中的位置。若L中没有元素的值为x ,则返回0值。(5)InsertList(L,i,x)在线性表L的第i个元素之前插入一个值为x 的新元素,表L的长度加1。(6)DeleteList(L,

6、i)删除线性表L的第i个元素,删除后表L的长度减1。4.顺序存储方法:把线性表的数据元素按逻辑顺序依次存放在一组地址连续的存储单元里的方法。顺序表(Sequential List):用顺序存储方法存储的线性表称为顺序表。顺序表是一种随机存取结构,顺序表的特点是逻辑上相邻的结点其物理位置亦相邻。5.顺序表上实现的基本运算:(1)插入:该算法的平均时间复杂度是O(n),即在顺序表上进行插入运算,平均要移动一半结点(n/2)。(2)删除:顺序表上做删除运算,平均要移动表中约一半的结点(n-1)/2,平均时间复杂度也是O(n)。6.采用链式存储结构可以避免频繁移动大量元素。一个单链表可由头指针唯一拟定

7、,因此单链表可以用头指针的名字来命名。生成结点变量的标准函数 p=( ListNode *)malloc(sizeof(ListNode); /函数malloc分派一个类型为ListNode的结点变量的空间,并将其首地址放入指针变量p中释放结点变量空间的标准函数 free(p);/释放p所指的结点变量空间 结点分量的访问 方法二:p-data和p-next指针变量p和结点变量*p的关系: 指针变量p的值结点地址, 结点变量*p的值结点内容7.建立单链表: (1) 头插法建表:算法: p=(ListNode *)malloc(sizeof(ListNode);/生成新结点 p-data=ch;

8、/将读入的数据放入新结点的数据域中 p-next=head; head=p;(2) 尾插法建表:算法: p=(ListNode *)malloc(sizeof(ListNode); /生成新结点 p-data=ch; /将读入的数据放入新结点的数据域中 if (head=NULL) head=p;/新结点插入空表 else rear-next=p;/将新结点插到*r之后 rear=p;/尾指针指向新表尾(3) 尾插法建带头结点的单链表:头结点及作用:头结点是在链表的开始结点之前附加一个结点。它具有两个优点: 由于开始结点的位置被存放在头结点的指针域中,所以在链表的第一个位置上的操作就和在表的其

9、它位置上操作一致,无须进行特殊解决; 无论链表是否为空,其头指针都是指向头结点的非空指针(空表中头结点的指针域空),因此空表和非空表的解决也就统一了。头结点数据域的阴影表达该部分不存储信息。在有的应用中可用于存放表长等附加信息。具体算法:r=head; /尾指针初值也指向头结点 while(ch=getchar()!=n) s=(ListNode *)malloc(sizeof(ListNode);/生成新结点 s-data=ch; /将读入的数据放入新结点的数据域中 r-next=s; r=s; r-next=NULL;/终端结点的指针域置空,或空表的头结点指针域置空以上三个算法的时间复杂度

10、均为O(n)。8.单链表上的查找:(带头结点)(1)按结点序号查找:序号为0的是头结点。算法:p=head;j=0;/从头结点开始扫描 while(p-next&jnext为NULL或i=j为止 p=p-next; j+; if(i=j) return p;/找到了第i个结点 else return NULL;/当i0时,找不到第i个结点时间复杂度:在等概率假设下,平均时间复杂度为:为n/2=O(n)(2)按结点值查找:具体算法:ListNode *p=head-next;/从开始结点比较。表非空,p初始值指向开始结点 while(p&p-data!=key)/直到p为NULL或p-data为

11、key为止 p=p-next;/扫描下一结点 return p;/若p=NULL,则查找失败,否则p指向值为key的结点时间复杂度为:O(n)9.插入运算:插入运算是将值为x的新结点插入到表的第i个结点的位置上,即插入到ai-1与ai之间。 s=(ListNode *)malloc(sizeof(ListNode); s-data=x;s-next=p-next;p-next=s;算法的时间重要花费在查找结点上,故时间复杂度亦为O(n)。10.删除运算 r=p-next;/使r指向被删除的结点ai p-next=r-next;/将ai从链上摘下 free(r);/释放结点ai的空间给存储池算法

12、的时间复杂度也是O(n)。 p指向被删除的前一个结点。 链表上实现的插入和删除运算,无须移动结点,仅需修改指针。11.单循环链表在单链表中,将终端结点的指针域NULL改为指向表头结点或开始结点即可。判断空链表的条件是head=head-next;12.仅设尾指针的单循环链表: 用尾指针rear表达的单循环链表对开始结点a1和终端结点an查找时间都是O(1)。而表的操作经常是在表的首尾位置上进行,因此,实用中多采用尾指针表达单循环链表。判断空链表的条件为rear=rear-next;13.循环链表:循环链表的特点是无须增长存储量,仅对表的链接方式稍作改变,即可使得表解决更加方便灵活。若在尾指针表

13、达的单循环链表上实现,则只需修改指针,无须遍历,其执行时间是O(1)。具体算法:LinkList Connect(LinkList A,LinkList B) /假设A,B为非空循环链表的尾指针LinkList p=A-next;/保存A表的头结点位置 A-next=B-next-next;/B表的开始结点链接到A表尾 free(B-next);/释放B表的头结点 B-next=p;/ return B;/返回新循环链表的尾指针循环链表中没有NULL指针。涉及遍历操作时,其终止条件就不再是像非循环链表那样判别p或p-next是否为空,而是判别它们是否等于某一指定指针,如头指针或尾指针等。在单链

14、表中,从一已知结点出发,只能访问到该结点及其后续结点,无法找到该结点之前的其它结点。而在单循环链表中,从任一结点出发都可访问到表中所有结点,这一优点使某些运算在单循环链表上易于实现。14.双向链表: 双(向)链表中有两条方向不同的链,即每个结点中除next域存放后继结点地址外,还增长一个指向其直接前趋的指针域prior。双链表由头指针head惟一拟定的。带头结点的双链表的某些运算变得方便。将头结点和尾结点链接起来,为双(向)循环链表。15.双向链表的前插和删除本结点操作双链表的前插操作void DInsertBefore(DListNode *p,DataType x)/在带头结点的双链表中,

15、将值为x的新结点插入*p之前,设pNULL DListNode *s=malloc(sizeof(DListNode);/ s-data=x;/ s-prior=p-prior;/ s-next=p;/ p-prior-next=s;/ p-prior=s;/ 双链表上删除结点*p自身的操作void DDeleteNode(DListNode *p) /在带头结点的双链表中,删除结点*p,设*p为非终端结点 p-prior-next=p-next;/ p-next-prior=p-prior;/ free(p);/ 与单链表上的插入和删除操作不同的是,在双链表中插入和删除必须同时修改两个方向上

16、的指针。上述两个算法的时间复杂度均为O(1)。16. 顺序表和链表比较时间性能:a、线性表:经常性的查找; b、链式存储结构:经常插入删除操作;空间性能:a、对数据量大小事先可以知道的用线性表; b、数据量变化较大的用链式存储结构。存储密度越大,存储空间的运用率越高。显然,顺序表的存储密度是1,链表的存储密度肯定小于1。第三章 栈和队列1.栈称为后进先出(Last In First Out)的线性表,简称为LIFO表。 栈是运算受限的线性表,顺序栈也是用数组表达的。 进栈操作:进栈时,需要将S-top加1, S-top=StackSize-1表达栈满上溢现象-当栈满时,再做进栈运算产生空间溢出

17、的现象。退栈操作:退栈时,需将S-top减1, S-topfront=Q-rear=0; 判队空: return Q-rear=Q-front; 判队满: return (Q-rear+1)%QueueSize=Q-front; 入队 Q-dataQ-rear=x; /新元素插入队尾 Q-rear=(Q-rear+1)%QueueSize; 出队 temp=Q-dataQ-front; Q-front=(Q-front+1)%QueueSize; /循环意义下的头指针加1 return temp;取队头元素 return Q-dataQ-front;6. 队列的链式存储结构简称为链队列。它是限

18、制仅在表头删除和表尾插入的单链表。 为了简化解决,在队头结点之前附加一个头结点,并设队头指针指向此结点。链队列的基本运算:(带头结点)(1) 构造空队:Q-rear=Q-front;Q-rear-next=NULL;(2) 判队空:return Q-rear=Q-front;(3) 入队:QueueNode *p=(QueueNode *)malloc(sizeof(QueueNode);/申请新结点 p-data=x; p-next=NULL; Q-rear-next=p; /*p链到原队尾结点后Q-rear=p; /队尾指针指向新的尾(4) 出队:当队列长度大于1时,只需修改头结点指针,尾

19、指针不变s=Q-front-next; Q-front-next=s-next; x=s-data; free(s); return x; 当队列长度等于1时,不仅要修改头结点指针,还要修改尾指针s=Q-front-next; Q-front-next=NULL; Q-rear=Q-front;x=s-data; free(s); return x;(5) 取队头元素:return Q-front-next-data; 由于有头结点,所以用了next和链栈类似,无须考虑判队满的运算及上溢。在出队算法中,一般只需修改队头指针。但当原队中只有一个结点时,该结点既是队头也是队尾,故删去此结点时亦需修

20、改尾指针,且删去此结点后队列变空。7.用计算机来解决计算算术表达式问题,一方面要解决的问题是如何将人们习惯书写的中缀表达式转换成后缀表达式。第四章 多维数组和广义表1.数组的顺序存储方式:一般采用顺序存储方法表达数组。(1)行优先顺序 a11,a12,a1n,a21,a22,a2n,,am1,am2,,amn(2)列优先顺序 a11,a21,am1,a12,a22,am2,,a1n,a2n,,amn Pascal和C语言是按行优先顺序存储的,而Fortran语言是按列优先顺序存储的。2.为了节省存储空间,可以对矩阵中有许多值相同或值为零的元素的矩阵,采用压缩存储。特殊矩阵是指相同值的元素或零元

21、素在矩阵中的分布有一定的规律。常见的有对称矩阵、三角矩阵。(1)对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij=aji 0i,jn-1称为n阶对称矩阵,它的元素是关于主对角线对称的,所以只需要存储矩阵上三角或下三角元素即可,让两个对称的元素共享一个存储空间。矩阵元素aij和数组元素sa【k】之间的关系是k=i(i+1)/2+j ij 0kn(n+1)/2-1k=j(j+1)/2+i ij 0kn(n+1)/2-1(2)三角矩阵:以主对角线划分,三角矩阵有上三角和下三角两种。上三角矩阵是指它的下三角(不涉及主角线)中的元素均为常数c或零;下三角矩阵的主对角线上方均为常数c或零。一般情

22、况,三角矩阵的常数c均为零。三角矩阵的压缩存储:三角矩阵中的反复元素c可共享一个存储空间,其余的元素正好有n(n+1)/2个,因此,三角矩阵可压缩存储在一维数组san(n+1)/2+1中,其中c存放在数组的最后一个元素中。三角矩阵的压缩存储结构是随机存取结构。3.稀疏矩阵:设矩阵Amn中有s个非零元素,若s远远小于矩阵元素的总数,则称A为稀疏矩阵。为了节省存储单元,可用压缩存储方法只存储非零元素。由于非零元素的分布一般是没有规律的,因此在存储非零元素的同时,还必须存储非零元素所在的行、列位置,所以可用三元组(i,j,aij)来拟定非零元素。稀疏矩阵进行压缩存储通常有两类方法:顺序存储(三元组表

23、)和链式存储(十字链表)。稀疏矩阵的压缩存储会失去随机存取功能。4.广义表是线性表的推广,又称列表。广义表是n(n0)个元素a1,a2,ai,an的有限序列。其中ai或者是原子或者是一个广义表。 广义表通常用圆括号括起来,用逗号分隔其中的元素。 为了区分原子和广义表,书写时用大写字母表达广义表,用小写字母表达原子。 若广义表Ls非空(n1),则al是LS的表头,其余元素组成的表(a1,a2,an)称为Ls的表尾。 广义表具有递归和共享的性质广义表的深度:一个表展开后所含括号的层数称为广义表的深度。19.广义表是一种多层次的线性结构,事实上这就是一种树形结构。任何一个非空广义表的表头可以是原子,

24、也可以是子表,而其表尾必然是子表。head=(a,b)=a,tail(a,b)=(b) 对非空表A和(y),也可继续分解。 注意:广义表()和()不同。前者是长度为0的空表,对其不能做求表头和表尾的运算;而后者是长度为l的由空表作元素的广义表,可以分解得到的表头和表尾均是空表()。广义表是一种有层次的非线性结构,通常采用链式存储结构,每个元素用一个结点表达,结点由3个域构成,其中一个是tag标志位,用来区分结点是原子还是子表,当tag为零时结点是子表,第二个域为slink,用以存放子表的地址;当tag为1时结点是原子,第二个域为data,用以存放元素值。第五章 树和二叉树1.树的表达法:最常用

25、的是树形图表达法;尚有3种嵌套集合、凹形、广义表。树结构的基本术语(1)结点的度(Degree) 树中的一个结点拥有的子树数称为该结点的度(Degree)。一棵树的度是指该树中结点的最大度数。 度为零的结点称为叶子(Leaf)或终端结点。度不为零的结点称分支结点或非终端结点。 除根结点之外的分支结点统称为内部结点。根结点又称为开始结点。(2)途径(path)若树中存在一个结点序列k1,k2,ki,使得ki是ki+1的双亲(1ij),则称该结点序列是从kl到kj的一条途径(Path)。 一个结点的祖先是从根结点到该结点途径上所通过的所有结点,而一个结点的子孙则是以该结点为根的子树中的所有结点。

26、结点的层数(Level)从根起算:根的层数为1,其余结点的层数等于其双亲结点的层数加1。 双亲在同一层的结点互为堂兄弟。 树中结点的最大层数称为树的高度(Height)或深度(Depth)。 若将树中每个结点的各子树当作是从左到右有顺序的(即不能互换),则称该树为有序树(OrderedTree);否则称为无序树(UnoderedTree)。若不特别指明,一般讨论的树都是有序树。 森林(Forest)是m(m0)棵互不相交的树的集合。树和森林的概念相近。删去一棵树的根,就得到一个森林;反之,加上一个结点作树根,森林就变为一棵树。3.二叉树与度数为2的有序树不同:在有序树中,虽然一个结点的孩子之间

27、是有左右顺序的,但是若该结点只有一个孩子,就无须区分其左右顺序。而在二叉树中,即使是一个孩子也有左右之分。二叉树的性质:性质1 二叉树第i层上的结点数目最多为2i-1(i1)。例如5层的二叉树,第5层上的结点数目最多为24=16性质2 深度为k的二叉树至多有2k-1个结点(k1)。例如深度为5的二叉树,至多有25-1=31个结点性质3 在任意-棵二叉树中,若终端结点的个数为n0,度为2的结点数为n2,则no=n2+1。例如一棵深度为4的二叉树(a),其终端结点数n0为8,度为2的结点树为7,则8=7+1,no=n2+1成立(b)其终端结点数n0为6,度为2的结点树为5,则6=5+1,no=n2

28、+1成立满二叉树:一棵深度为k且有2k-1个结点的二又树称为满二叉树。满二叉树的特点:(1)每一层上的结点数都达成最大值。即对给定的高度,它是具有最多结点数的二叉树。(2)满二叉树中不存在度数为1的结点,每个分支结点均有两棵高度相同的子树,且树叶都在最下一层上。完全二叉树:若一棵深度为k的二叉树,其前k-1层是一棵满二叉树,而最下面一层上的结点都集中在该层最左边的若干位置上,则此二叉树称为完全二叉树。特点: (1) 满二叉树是完全二叉树,完全二叉树不一定是满二叉树。 (2) 在满二叉树的最下一层上,从最右边开始连续删去若干结点后得到的二叉树仍然是一棵完全二叉树。 (3) 在完全二叉树中,若某个

29、结点没有左孩子,则它一定没有右孩子,即该结点必是叶结点。性质4具有n个结点的完全二叉树的深度为。logn+1 或log(n+1)例,具有100个结点的完全二叉树的深度为:lg100+1=7,26=64 27=128所以lg100=6,lg(100+1)=74.完全二叉树的编号特点:完全二叉树中除最下面一层外,各层都充满了结点。每一层的结点个数恰好是上一层结点个数的2倍。从一个结点的编号就可推得其双亲,左、右孩子等结点的编号。编号从0开始若i=0,则qi为根结点,无双亲;否则,qi的双亲编号为(i-1)/2。若2i+1n,则qi的左孩子的编号是2i+1;否则,qi无左孩子,即qi必然是叶子。若2

30、i+2n,则qi的右孩子的编号是2i+2;否则,qi无右孩子。对于完全二叉树而言,使用顺序存储结构既简朴又节省存储空间。但对于一般二叉树来说,采用顺序存储时,为了使用结点在数组中的相对位置来表达结点之间的逻辑关系,就必须增长一些虚结点使其成为完全二叉树的形式。5.链式存储结构: 二叉树的每个结点最多有两个孩子。用链接方式存储二叉树时,每个结点除了存储结点自身的数据外,还应设立两个指针域lchild和rchild,分别指向该结点的左孩子和右孩子。结点的结构为:二叉链表是一种常用的二叉树存储结构。建立二叉链表方法:a、按广义表方法,靠近左括号的结点是在左子树上,而逗号右边结点是在右子树上。b、按完

31、全二叉树的层次顺序建立结点。具有n个结点的二叉链表中,共有2n个指针域。其中有n-1个用来指示结点的左、右孩子,其余的n+1个为空。二叉树遍历算法中的递归终止条件是二叉树为空。递归工作栈中涉及两项:一项是递归调用的语句编号,另一项则是指向根结点的指针。 已知一棵二叉树的前序和中序遍历序列或中序和后序遍历序列,可唯一拟定一棵二叉树。具体方法如下: 一方面根据前序或后序遍历序列拟定二叉树的各子树的的根,然后根据中序遍历序列拟定各子树根的左右子树。6.线索二叉树:n个结点的二叉链表必然存在n+1个空指针域,可以运用这些空指针域,存放指向结点在某种遍历顺序下的前趋和后继结点的指针,这种指向前驱和后继结

32、点的指针称为线索,这种加上线索的二叉链表称为线索链表,相应的二叉树称为线索二叉树(Threaded BinaryTree)。线索链表的结点结构:其中:ltag和rtag是增长的两个标志域,用来区分结点的左、右指针域是指向其左、右孩子的指针,还是指向其前趋或后继的线索。 图中的实线表达指针,虚线表达线索。 线索二叉树中,一个结点是叶结点的充要条件为:左、右标志均是1。7.二叉树的线索化: 把对一棵二叉线索链表结构中所有结点的空指针域按照某种遍历顺序加线索的过程称为线索化。和中序遍历算法同样,递归过程中对每结点仅做一次访问。因此对于n个结点的二叉树,线索化的算法时间复杂度为O(n)。8.树、森林到

33、二叉树的转换:树中每个结点最多只有一个最左边的孩子(长子)和一个右邻的兄弟。将树转换成二叉树:在所有兄弟结点之间加一道连线;对每个结点,除了保存与其长子的连线外,去掉该结点与其它孩子的连线。由于树根没有兄弟,故树转化为二叉树后,二叉树的根结点的右子树必为空。将一个森林转换为二叉树:将森林中的每棵树转化成二叉树,然后再将二叉树的根节点看做兄弟连在一起,形成一棵二叉树9.二叉树到树、森林的转换: 方式是:若二叉树中结点x是双亲y的左孩子,则把x的右孩子,右孩子的右孩子,都与y用连线连起来,最后去掉所有双亲到右孩子的连线。10.树的存储结构:1.双亲表达法:双亲链表表达法运用树中每个结点的双亲唯一性

34、,在存储结点信息的同时,为每个结点附设一个指向其双亲的指针parent,惟一地表达任何-棵树。(1)双亲链表表达法的实现分析:E和F所在结点的双亲域是1,它们的双亲结点在向量中的位置是1,即B是它们的双亲。 注意: 根无双亲,其parent域为-1。 双亲链表表达法中指针parent向上链接,适合求指定结点的双亲或祖先(涉及根);求指定结点的孩子或其它后代时,也许要遍历整个数组。2.孩子链表法:孩子链表表达法是为树中每个结点设立一个孩子链表,并将这些结点及相应的孩子链表的头指针存放在一个向量中。注意: 孩子结点的数据域仅存放了它们在向量空间的序号。 与双亲链表表达法相反,孩子链表表达便于实现涉

35、及孩子及其子孙的运算,但不便于实现与双亲有关的运算。 将双亲链表表达法和孩子链表表达法结合起来,可形成双亲孩子链表表达法。3.孩子兄弟表达法:在存储结点信息的同时,附加两个分别指向该结点最左孩子和右邻兄弟的指针域,即可得树的孩子兄弟链表表达。注意: 这种存储结构的最大优点是:它和二叉树的二叉链表表达完全同样。可运用二叉树的算法来实现对树的操作。11.树的遍历:一般都只给出两种顺序遍历树的方法:前序(先根顺序)遍历和后序(后根顺序)遍历。 前序遍历一棵树等价于前序遍历该树相应的二叉树 后序遍历一棵树等价于中序遍历该树相应的二叉树。对下面(a)图中所示的森林进行前序遍历和后序遍历,则得到该森林的前

36、序序列和后序序列分别为ABCDEFIGJH和BDCAIFJGHE。而(b)图所示二叉树的前序序列和中序序列也分别为ABCDEFIGJH和BDCAIFJGHE。 前序遍历森林等同于前序遍历该森林相应的二叉树 后序遍历森林等同于中序遍历该森林相应的二叉树12.从根结点到某结点之间的途径长度与该结点上权的乘积称为该结点的带权途径长度,树种所有叶子结点的带权途径长度之和称为树的带权途径长度。 带权途径长度WPL最小的二叉树称为哈夫曼树或最优二叉树。 哈夫曼树不一定是二叉树。 哈夫曼树又称为最优树,是一类带权途径长度最短的树。完全二叉树就是这种途径长度最短的二叉树。 只有叶结点上的权值均相同时,完全二叉

37、树一定是最优二叉树,否则完全二叉树不一定是最优二叉树。 最优二叉树中,权越大的叶子离根越近。 最优二叉树的形态不唯一,WPL最小。13.哈夫曼算法: 注意: 初始森林中的n棵二叉树,每棵树有一个孤立的结点,它们既是根,又是叶子 n个叶子的哈夫曼树要通过n-1次合并,产生n-1个新结点。最终求得的哈夫曼树中共有2n-1个结点。 哈夫曼树是严格的二叉树,没有度数为1的分支结点。14.哈夫曼编码:数据压缩过程称为编码,反之,解压缩的过程称为解码。设计一种长短不等的编码,则必须保证任一字符的编码都不是另一个字符编码的前缀,这种编码称为前缀编码。可以运用二叉树来设计二进制的前缀编码,其左分支表达字符0,

38、右分支表达字符1,则以根结点到叶结点途径上的分支字符组成的串作为该叶节点的字符编码。因此设计电文总长最短的二进制前缀编码,就是以n种字符出现的频率作为权构造一棵哈夫曼树,由哈夫曼树求得的编码就是哈夫曼编码。译码过程是从树根结点出发,逐个读入电文中的二进制码。第六章1.图G由两个集合构成,顶点集合和边集合,也可以图G只有顶点而没有边。用尖括号表达图的有向边,有向边又称为弧,起点称为弧尾,终点称为弧头。无向图的顶点对用圆括号表达(vi,vj)。在无向图中,称vi和vj相邻接,在有向图中称顶点vi邻接到vj,顶点vj邻接于vi在无向图中,n的取值范围是0-n(n-1)/2,将具有n(n-1)/2条边

39、的无向图称为无向完全图。在有向图中,n的取值范围是0-n(n-1),将具有n(n-1)条边的有向图称为有向完全图。无向图中,顶点的度定义为以该顶点为一个端点的边的数目,有向图的度等于出度和入度之和。在无向图中,任意两顶点都有途径,则称两顶点连通。若图G中的任意两个顶点都连通,称G为连通图。无向图的极大连通子图称为连通分量,显然,任何连通图的连通分量只有一个,即其自身,而非连通的无向图有多个连通分量。在有向图中,图G中任意两顶点连通,称为强连通图,极大连通子图称为强连通分量。若在一个图的每条边上标上某种数值,该数值称为该边的权。边上带权的图称为带权图,带权的连通图称为网络。2.图的存储结构:邻接矩阵和邻接表表达法。图的顶点编号从0开始。 邻接矩阵表达法:或(vi,vj)是边,则值为1,不是边则值为0。无向图的邻接矩阵是按主对角线对称的。若G是带权图,只要把1换成相应边上的权值即可,0的位置上可以不动或将其换成无穷大表达。无向图的邻接矩阵表达法可以仅存储主对角线以下的元素,时间复杂度为O(n2) 邻接表表达法:邻接表是图的一种链式存储结构。将无向图的邻接表称为边表,将有向图的邻接表称为出边表,将邻接表的表头向量称为顶点表。若无向图有n个顶点和e条边,则它的邻接表共有n个头结点和2e个表结点。建立邻接表的时间复杂度是O(n+e)。图的邻接表表达不是唯一的,这是由于在每个顶点的邻接表中

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 初中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com