ImageVerifierCode 换一换
格式:DOCX , 页数:24 ,大小:47.64KB ,
资源ID:24661282      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/24661282.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构复习要点.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构复习要点.docx

1、数据结构复习要点A熟练掌握 B理解 C了解第一章:绪论1. 基本概念:包括数据的逻辑结构、数据的存储结构和数据的相关运算。C四类数据组织结构:集合、线性表、树形、图状结构 C数据的存储方式:顺序存储和链式存储。B2.算法和分析算法的特征、时间复杂度的分析和常见的时间复杂度增长率排序、空间复杂度 B本章重点:分析算法时间复杂度例1. 下面关于算法说法错误的是( )A算法最终必须由计算机程序实现B.为解决某问题的算法同为该问题编写的程序含义是相同的C. 算法的可行性是指指令不能有二义性 D. 以上几个都是错误的D例2. 以下那一个术语与数据的存储结构无关?( )A栈 B. 哈希表 C. 线索树 D

2、. 双向链表A例3. 求下段程序的时间复杂度:void mergesort(int i, int j) int m; if(i!=j) m=(i+j)/2; mergesort(i,m); mergesort(m+1,j); merge(i,j,m);其中mergesort()用于对数组an归并排序,调用方式为mergesort(0,n-1);,merge()用于两个有序子序列的合并,是非递归函数,时间复杂度为。解:分析得到的时间复杂度的递归关系:为merge()所需的时间,设为cn(c为常量)。因此 令 ,有有第二章:线性表1.线性表的基本运算:. C2.线性表的顺序存储(利用静态数组或动态

3、内存分配)。相应的表示与操作 A3.线性表的链式存储。相应的表示与操作。包括循环链表、双向链表。 A4.顺序存储与链式存储的比较:基于时间的考虑-分别适用于静态的和动态的操作:比如静态查找和插入删除);基于空间的考虑- . B这也适用于后面用两种方式存储的其他数据结构。本章重点:很熟悉顺序表,单链表、双链表,循环链表的基本操作;并学会在各种链表上进行一些算法设计(与基本操作类似的操作或组合),请仔细复习。例4假设有两个按元素值递增次序排列的线性表,均以单链表形式存储。请编写算法将这两个单链表归并为一个按元素值递减次序排列的单链表,并要求利用原来两个单链表的结点存放归并后的单链表。 题目分析因为

4、两链表已按元素值递增次序排列,将其合并时,均从第一个结点起进行比较,将小的链入链表中,同时后移链表工作指针。该问题要求结果链表按元素值递减次序排列。故在合并的同时,将链表结点逆置。void Union(LinkList la, LinkList lb) la,lb分别是带头结点的两个单链表的头指针,链表中的元素值按递增序排列,本算法将两链表合并成一个按元素值递减次序排列的单链表。 pa=la-next; pb=lb-next;pa,pb分别是链表la和lb的工作指针 la-next=null; la作结果链表的头指针,先将结果链表初始化为空。 while(pa!=null & pb!=null

5、) 当两链表未访问结束 if(pa-datadata) q=pa-next; 将pa 的后继结点暂存于q。 pa-next=la-next; 将pa结点链于结果表中,同时逆置。la-next=pa;pa=q; 恢复pa为当前待比较结点。elseq=pb-next; 将pb 的后继结点暂存于q。pb-next=la-next; 将pb结点链于结果表中,同时逆置。la-next=pb;pb=q; 恢复pb为当前待比较结点。while(pa!=null) 将la表的剩余部分链入结果表,并逆置。 q=pa-next; pa-next=la-next; la-next=pa; pa=q; while(p

6、b!=null) q =pb-next; pb-next=la-next; la-next=pb; pb=q; 算法Union结束。注意:(1)此处q用作暂存后继结点,操作后pa或pb还回原指向位置;这与我们原来不改变pa或pb的指向,增加一个q=pa或pb作为摘取结点进行添加操作起到的作用一样。(2) 此处要完成逆序插入操作故用头插法(基于头指针la或lb),注意尾插法(附设一个尾指针,基于该指针插入)的可完成顺序插入。(注意:逆序另一种方式也要掌握!)练习:练习题2 编程167.判断带头结点双向循环链表L是否对称相等.8. 设计一个算法判断单链表(带头结点)是否是递增的(注意比排序算法应该

7、简单,链表排序也要会实现)9. 设计一个算法判断有序表A是否是有序表B的子集(即表A中的元素在B中)。(思考:如果递归程序怎么写?)第三章:栈与队列1.两种特殊线性表:分别有后进先出、先进先出的特性。 B2.栈的顺序表示与实现(利用静态数组或动态内存分配) A 注意栈顶指针的初始位置不同,进出栈,栈空栈满的实现语句有差别! 举例:若定义typedef struct SElemType *base; SElemType *top; int stacksize;/当前栈能使用的最大容量 SqStack; SqStack s;top的初始值指向栈底,即top=base;栈空条件:s. top =s.

8、 base 此时不能出栈 栈满条件:s.top-s.base=s.stacksize 进栈操作:*s.top+=e; 或*s.top=e; s.top+; 退栈操作:e=*-s.top; 或s.top-; e=*s.top若定义:typedef struct SElemType baseMAXSIZE; int top; SqStack; SqStack s;top的初始值为0时: 栈空条件:s. top =0 此时不能出栈 栈满条件:s.top = MAXSIZE 进栈操作:s.bases.top+=e; 退栈操作:e=s.base-s.toptop的初始值为-1时: 栈空条件:s. top

9、 = -1 此时不能出栈 栈满条件:s.top = MAXSIZE-1 进栈操作:s.base+s.top=e; 退栈操作:e=s.bases.top-3.栈的链式表示与实现 B (对比顺序栈,实质不带头结点的链表在头指针处插入和删除)4.队列的顺序表示与实现循环队列 A设两个指针:Q.front 指向队列头元素;Q.rear 指向队列尾元素的下一个位置注意队中若Q.rear 指向队列尾元素,进出队,实现语句有差别!初始状态(空队列):Q.front = Q.rear=0队头指针进1: Q.front = (Q.front + 1)% MAXSIZE队尾指针进1: Q.rear = (Q.re

10、ar + 1)% MAXSIZE;队列初始化: Q.front = Q.rear = 0;队空条件: Q.front = Q.rear;队满条件:(Q.rear + 1) % MAXSIZE = Q.front 队列长度:(Q.rear-Q.front+MAXSIZE)%MAXSIZE6.队列的链式表示与实现 B 本章重点:顺序栈的初始条件、操作,循环队列的初始条件、操作本章难点:栈的设计与使用,队列的设计与使用(主要结合后面树和图中的应用复习)例5链栈与顺序栈比起来优势在于 。没有预设容量的限制例6计算算术表达式的值时,可用两个栈作辅助工具。对于给出的一个表达式,从左向右扫描它的字符,并将操

11、作数放入栈S1中,运算符放入栈S2中,但每次扫描到运算符时,要把它同S2的栈顶运算符进行优先级比较,当扫描到的运算符的优先级不高于栈顶运算符的优先级时,取出栈S1的栈顶和次栈顶的两个元素,以及栈S2的栈顶运算符进行运算将结果放入栈S1中(得到的结果依次用T1、T2等表示)。为方便比较,假设栈S2的初始栈顶为(运算符的优先级低于加、减、乘、除中任何一种运算)。现假设要计算表达式: A-B*C/D+E/F。写出栈S1和S2的变化过程。步骤栈S1栈S2输入的算术表达式(按字符读入)初始A-B*C/D+E/F1AA-B*C/D+E/F2A-B*C/D+E/F3AB-B*C/D+E/F4AB-*C/D+

12、E/F5ABC-*C/D+E/F6AT1(注:T1=B*C)-/D+E/F7AT1D-/D+E/F8AT2(注:T2=T1/D)T3 (注:T3=A-T2)-+E/F9T3E+E/F10T3E+/F11T3EF+/F12T3T4(注:T4=E/F)T5(注:T5= T3+ T4)+例7将两个栈存入数组V1.m应如何安排最好?这时栈空、栈满的条件是什么?,入栈和出栈的操作是什么?分析:为了增加内存空间的利用率和减少溢出的可能性,由两个栈共享一片连续的空间时,应将两栈的栈底分别设在内存空间的两端,这样只有当两栈顶指针相邻(即值之差的绝对值为1时才产生溢出。设栈S1和栈S2共享向量V1.m,初始时,

13、栈S1的栈顶指针top0=0,栈S2的栈顶指针top1=m+1,当top0=0为栈S1空,top1=m+1为栈S2空;当top0=0并且top1=m+1时为两栈全空。当top1-top0=1时为栈满。 入栈核心操作 S1: V+top0=x1; S2: V-top1=x2 出栈核心操作 S1: x1=Vtop0-; S2: x2=Vtop1+例8如果用一个循环数组base0.MAX-1表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,而改置计数器count用以记录队列中结点的个数。(1)编写实现队列的三个基本运算:判空、入队、出队(2)队列中能容纳元素的最多个数是多少ty

14、pedef struct ElemType baseMAX; int front,count; /front是指向队头元素针,count是队列中元素个数。CQueue; /定义类型标识符。(1)判空:int Empty(CQueue q) /q是CQueue类型的变量 if(q.count=0) return(1);else return(0); /空队列入队: int EnQueue(CQueue q,ElemType x)if(q.count=MAX)printf(“队满n”);exit(0); q.base(q.front+q.count)%MAX=x; /x入队 q.count+; r

15、eturn(1); /队列中元素个数增加1,入队成功。出队: int DelQueue(CQueue q, ElemType &x)if (q.count=0)printf(“队空n”);return(0);x=q.baseq.front;q.front=(q.front+1)%MAX; /计算新的队头指针q.count-;return(1);(2) 队列中能容纳的元素的个数为MAX。第四章:串1.串的基本概念 C2.串的顺序表示与实现(两种存储方式) A 特别的模式匹配算法之KMP算法 B本章重点:串的定长顺序存储和堆分配存储、掌握一些常规的串操作(自己会用和会编写)本章难点:串的模式匹配快

16、速算法(KMP)例9. 串的定长顺序存储缺点在于存在 情况。截断例10已知u=xyxyxyxxyxy;t=xxy;ASSIGN(s,u);ASSIGN(v,SUBSTR(s,INDEX(s,t),LEN(t)+1);ASSIGN(m,ww)求REPLACE(,m)= _。 xyxyxywwy例1114设字符串S=aabaabaabaac,P=aabaac(1)给出S和P的next值和nextval值; (2)若S作主串,P作模式串,试给出利用BF算法和KMP算法的匹配过程。(1)(1)p的next与nextval值分别为012123和002003。 (2)利用BF算法的匹配过程: 第一趟匹配:

17、 aabaabaabaac aabaac(i=6,j=6) 第二趟匹配: aabaabaabaac aa(i=3,j=2) 第三趟匹配: aabaabaabaac a(i=3,j=1) 第四趟匹配: aabaabaabaac aabaac(i=9,j=6)第五趟匹配: aabaabaabaac aa(i=6,j=2)第六趟匹配: aabaabaabaac a(i=6,j=1)第七趟匹配: aabaabaabaac 利用KMP算法的匹配过程: 第一趟匹配:aabaabaabaac aabaac(i=6,j=6,nextval(j)=3) 第二趟匹配:aabaabaabaac (aa)baac (

18、i=9,j=6) 第三趟匹配:aabaabaabaac (成功) (aa)baac(i=13,j=7)例12一般串定位函数Index(S,T,pos), 设S的串长为n,T的串长为m,则最坏时间复杂度 ;而改进的Index_KMP(S,T,pos) 时间复杂度为 。 第五章:数组和广义表1.数组的存储结构:以行为主序、以列为主序的地址映像函数 B2矩阵的压缩存储:(1)特殊阵:包括对称阵、三角阵、带状阵(利用其特性压缩存储到一维数组)B (2)稀疏阵 利用的是三元组顺序表来表示 B 用十字链表表示C(本次考试不做要求)3.广义表定义与存储表示 B (本次考试不做要求)本章重点:地址映像函数的计

19、算(包括数组和特殊矩阵)例13已知n阶下三角矩阵A(即当ij时,有aij=0),按照压缩存储的思想,可以将其主对角线以下所有元素(包括主对角线上元素 )依次存放于一维数组B中,请写出从第一列开始采用列序为主序分配方式时在B中确定元素aij的存放位置的公式。答:n阶下三角矩阵元素Aij(1=i,j=j)。第1列有n个元素,第j列有n-j+1个元素,第1列到第j-1列是等腰梯形,元素数为(n+(n-j+2)(j-1)/2,而aij在第j列上的位置是为i-j+1。所以n阶下三角矩阵A按列存储,其元素aij在一维数组B中的存储位置k与i和j的关系为:k=(n+(n-(j-1)+1)(j-1)/2+(i

20、-j+1)=(2n-j)(j-1)/2+i第六章:二叉树与树1.二叉树的定义和性质: B 几个特殊的二叉树:满二叉树、完全二叉树、二叉排序树、平衡二叉树 B2.二叉树的顺序存储: C3.二叉树的链式存储: 用二叉链表表示与实现 A4.二叉树的遍历:先(中、后)序遍历及应用,相应递归算法和非递归算法 A5.线索化二叉树(利用二叉链表n+1空指针域来存放某遍历下指向该结点的直接前驱或直接后继,使得蕴含更多信息) B6.二叉树的应用:算术表达式,霍夫曼树(最优二叉树),判定树 B7.树的定义和存储表示:. B8.树和森林和二叉树的转换 B9.树与森林的遍历 B本章重点:很熟悉二叉树(在二叉链表表示下

21、)的基本操作的递归算法和遍历的非递归算法,请仔细复习。 本章难点:二叉树(含排序树、平衡树)的递归算法和非递归算法。线索化二叉树及相应操作,重在理解,不考编程!例14引入二叉线索树的目的是( )A将非线性序列转化成某种线性序列;加快查找结点的前驱或后继的速度 B为了能在二叉树中方便的进行插入与删除C为了能方便的找到双亲 D使二叉树的遍历结果唯一A例15二叉链表在线索化后,仍不能有效求解的问题是( )。A前(先)序线索二叉树中求前(先)序后继 B中序线索二叉树中求中序后继C中序线索二叉树中求中序前驱 D后序线索二叉树中求后序后继 D例16在平衡二叉树中插入一个结点后造成了不平衡,设最低的不平衡结

22、点为A,并已知A的左孩子的平衡因子为-1右孩子的平衡因子为0,则应作( ) 型调整以使其平衡。(平衡因子=左子树深度-右子树深度)A. LL (单向右旋) B. LR (先左后右双向旋转)C. RL (先右后左双向旋转) D. RR (单向左旋)B例17一棵非空的二叉树其先序序列和后序序列正好相反,画出这棵二叉树的形状。先序序列是“根左右” 后序序列是“左右根”,可见对任意结点,若至多只有左子女或至多只有右子女,均可使前序序列与后序序列相反,图示如下:例18:已知二叉树结点结构如下:用C语言表示 typedef struct BiNodeElemType data; struct BiNode

23、 *lchild,*rchild;int val; BiNode,*BiTree; 其中val域表示该结点的子孙(含孩子结点)的个数。开始时,val域值均为0,T为指向某二叉树根结点的指针。请写算法填写该二叉树中每个结点的val域。递归算法如下:int writeVal(BiNode *root) if(root=NULL) root-val=0; else if(root-lchild=NULL&root-rchild=NULL) root-val=1; else root-val=writeVal(root-lchild)+writeVal(root-rchild); return roo

24、t-val; 例19编写一个算法,将指针S所指的结点插入到根结点指针为T的二叉排序树中,若已存在则不再插入返回0;否则返回1。(递归的算法见教材)int Insert_BST( BiTree &T, BiTNode S ) BiTree p, q; /p指向当前访问的结点 if(!T) T=S; else p=T; while ( p ) q = p; /q指向p结点的双亲结点 if (S-data.key data.key) p = p-lchild; else if(S-data.key p-data.key) p = p-rchild; else p=NULL; if (S-data.k

25、ey = q-data.key) return 0; if (S-data.key data.key) q-lchild = S; else q-rchild = S; return 1;例20编写一个算法,计算平衡二叉树中所有结点的平衡因子解:计算一个结点bt的bf的值递归模型如下:f(bt): bt-bf不存在 当bt=NULLf(bt): bt-bf=0 当 bt-lchild=NULL&bt-rchild=NULLf(bt): bt-bf=bt的右子树的高度左子树的高度其它情况 可选用先序的方式统计出各个结点的平衡因子如何求高度呢?递归模型如下:f(bt): 不存在 当bt=NULLf

26、(bt): 当 bt-lchild=NULL&bt-rchild=NULLf(bt): bt的左子树和右子树的高度的最大值其它情况 int Height(BSTNode *bt)/求树的高度 int max1,max2; if(bt=NULL) return 0; else if(bt-lchild=NULL&bt-rchild=NULL) return 1; else max1=Height(bt-lchild); max2=Height(bt-rchild); return max1max2?max1+1:max2+1; void Countbf(BSTNode *&bt) /求所有结点的

27、bf if(bt!=NULL) if(bt-lchild=NULL&bt-rchild=NULL) bf-bf=0; else Countbf(bt-lchild); Countbf(bt-rchild); bt-bf= Height(bt-rchild)-Height(bt-lchild); 实质上可以将上面求bf和求高度合二为一。int Countbf1(BSTNode *&bt)/求所有结点的bf,返回对应结点高度值 int max1,max2; if(bt=NULL) return 0; if(bt-lchild=NULL&bt-rchild=NULL) bf-bf=0; return

28、1; else max1=Height(bt-lchild); max2=Height(bt-rchild); bt-bf= max2-max1; return max1max2?max1+1:max2+1; 例21 设给出一段报文: CAST CAST SAT AT A TASA;字符集合是 C, A, S, T ,各个字符出现的频度(次数)是 W 2, 7, 4, 5 ;试设计赫夫曼编码,画出赫夫曼树。若给每个字符以等长编码A : 00 T : 10 C : 01 S : 11;试说明赫夫曼编码比此方案的优越之处。(编码最短) 解答见ppt练习 1设计一个算法,删除该二叉树,释放所有结点2设计一算法判断二叉链表存储的二叉树是否结构对称(左右子树结点结构对称相同)3试写出复制一棵二叉树的算法。二叉树采用标准链接结构。4习题六编程 (除打星号的部分) 5. 设计一个算法,寻找二叉树中满足特定数值x的第一个结点(相应的变形:寻找最小值,寻找父结点,寻找兄弟) 6. 设计一个算法,统计二叉树中满足特定数值x结点的个数(相应的变形:统计度为0,1,2的结点)第七章 图1.图的定义、基本概念:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1