第一章1、数据结构是一门研究非数值计算的程序设计问题中计算机的操作对象以及它们之间的关系和操作等的学科。
数据结构(Data Structure):相互之间存在一种或多种特定关系的数据元素的集合。
2、数据结构的形式定义:二元组Data_Structure=(D,S) 其中,D 是数据元素的有限集,S 是D 上关系的有限集。
3、数据元素之间关系的映像:1、顺序映像(顺序存储结构):以相对的存储位置表示后继关系。
2、非顺序映像(链式存储结构):借助指针元素存储地址的指针表示数据元素之间的逻辑关系。
任何一个算法的设计取决于数据(逻辑)结构,其实现取决于物理结构。
4、 算法的定义:对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。
特性:有穷性、确定性、可行性、输入、输出5、 算法的评价——衡量算法优劣的标准正确性(correctness):满足具体问题的需求可读性(readability):易读、易理解健壮性(robustness):当输入数据非法时,算法能够做出反应或进行处理效率与低存储量:执行时间短、存储空间小作业的答案:试描述数据结构和抽象数据类型的概念与程序设计语言中数据类型概念的区别。
第二章1、线性表是一种最简单的线性结构。
线性结构 是一个数据元素的有序(次序)关系特点:存在唯一的一个“第一个”的数据元素;存在唯一的一个“最后一个”的数据元素;除第一个数据元素外,均有唯一的前驱;除最后一个数据元素外,均有唯一的后继2、线性表类型的实现——顺序映像 定义:用一组地址连续的存储单元依次存放线性表中的数据元素。
⏹ 以“存储位置相邻”表示有序对<ai -1,ai >,则有:LOC (ai ) = LOC (ai -1) + l 其中l 是一个数据元素所占存储量LOC (ai ) = LOC (a 1) + (i -1)×l⏹ 特点:1、实现逻辑上相邻—物理地址相邻2、实现随机存取3、若假定在线性表中任何一个位置上进行插入的概率都是相等的,则移动元素的期望值为:∑+=+-+=11)1(11n i is i n n E 2n = 若假定在线性表中任何一个位置上进行删除的概率都是相等的,则移动元素的期望值为:∑=-=n i dl i n n E 1)(121-=n 4、 线性表类型的实现——链式映像 线性链表 特点:用一组地址任意的存储单元存放线性表中的数据元素。
5、在单链表中第 i 个结点之前进行插入的基本操作为:找到线性表中第i-1个结点,然后修改其指向后继的指针。
s = (LinkList) malloc ( sizeof (LNode)); // 生成新结点s->data = e; s->next = p->next; p->next = s; // 插入在单链表中删除第 i 个结点的基本操作为:找到线性表中第i-1个结点,修改其指向后继的指针。
q = p->next; p->next = q->next; e = q->data; free(q);5、 循环链表:最后一个结点的指针域的指针又指回第一个结点的链表。
和单链表的差别仅在于: 判别链表中最后一个结点的条件不再是“后继是否为空”,而是“后继是否为头结点”。
6、 双向链表的操作特点:1、“查询” 和单链表相同;2、“插入” 和“删除”时需要同时修改两个方向上的指针 “插入”:s->next = p->next; p->next = s; s->next->prior = s; s->prior = p;(s 是插入的结点)删除:p->next = p->next->next; p->next->prior = p;(要删除的是p 的下一个结点)课后作业P13: 2.3、2.5P15: 2.8、2.9(2)第三章1、栈、队列的特点:☐从数据元素间的逻辑关系看◊是线性表☐从操作方式与种类看◊不同于线性表:栈与队列是操作受限的线性表2、栈的基本概念栈---是限制仅在线性表的一端进行插入和删除运算的线性表。
栈顶(TOP)--允许插入和删除的一端。
栈底(bottom)--不允许插入和删除的一端。
空栈--表中没有元素。
栈--又称为后进先出的线性表3、栈中元素的特性:1、具有线性关系2、后进先出4、栈的进栈出栈规则:a)按序进栈:有n个元素1,2,…,n,它们按1,2, …, n的次序进栈(i进栈时,1~(i-1)应该已经进栈);b)栈顶出栈:栈底最后出栈;c)时进时出:元素未完全进栈时,即可出栈。
5、栈的表示与实现顺序栈即栈的顺序存储结构:一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。
1、附设一个栈底指针base,总是指向栈底。
2、附设一个栈顶指针top。
空栈时,top=base;非空栈时,总是指向栈顶元素+1的位置。
☐插入一个栈顶元素,指针top增1;☐删除一个栈顶元素,指针top减1;☐非空栈中的栈顶指针始终在栈顶元素的下一个位置上链栈:注意: 链栈中指针的方向指向前驱结点!6、队列⏹队列:只允许在表的一端进行插入,而在表的另一端进行删除的线性表。
☐队尾(rear)——允许插入的一端☐队头(front)——允许删除的一端⏹队列特点:先进先出(FIFO)7、队列类型的实现⏹链队列——队列的链式表示和实现⏹顺序队列——队列的顺序表示和实现用一组连续的存储单元依次存放队列中的元素8、顺序队列运算时的头、尾指针变化设两个指针front,rear,约定:rear指示队尾元素;front指示队头元素前一位置初值front=rear=0空队列条件:Q.front==Q.rear队列满:Q.rear-Q.front=m入队列:Q.base[rear++]=x;出队列:x=Q.base[++front];存在问题:设数组维数为M,则:⏹当rear-front=m时,再有元素入队发生溢出——真溢出⏹当rear已指向队尾,但队列前端仍有空位置时,再有元素入队发生溢出——假溢出!9、循环队列:将数组首尾相接(即:base[0]连在base[m-1]之后)。
入/出队列运算利用“模运算”,则:➢入队:Q.rear=(Q.rear+1)%m➢出队:Q.front=(Q.front+1)%m队满和队空判断条件:少用一个元素空间:队空:Q.rear=(Q.front)队满:(Q.rear+1)%m=Q.front10、栈和队列是限定插入和删除只能在表的“端点”进行的线性表。
a)栈具有“后进先出”的特性;b)队列具有“先进先出”的特性。
11、栈的链式存储不需头结点。
课后作业1. 用栈结构计算中缀式2+(4-3)*6,画出计算过程栈的结构。
2. 简述以下算法的功能(栈和队列的元素类型均为int)void algo3 (Queue &Q){Stack S; int d;InitStack(S);while (!QueueEmpty(Q)){DeQueue(Q, d); Push(S, d);}while (!StackEmpty(S)){Pop(S, d); EnQueue(Q, d);}}第六章本章小结⏹二叉树的结构特性,各性质相应的证明方法。
⏹二叉树的各种存储结构的特点及适用范围。
⏹遍历二叉树是二叉树各种操作的基础,遍历的具体算法与所采用的存储结构有关。
⏹树和森林与二叉树的转换。
⏹最优二叉树的特性,掌握建立最优树和哈夫曼编码的方法。
-、树的定义1、树型结构:(非线性结构)至少存在一个数据元素有两个或两个以上的直接前驱(或直接后继)元素的数据结构。
树的定义:是n(n≥0)个结点的有限集合T,对于任意一棵非空树,它满足:有且仅有一个特定的称为根(root)的结点;当n>1时,其余结点可分为m(m>0)个互不相交的有限集T1,T2,….,T m,其中每个集合本身又是一棵树,称为根的子树。
上述树的定义是一个递归定义。
2、基本术语结点:包含一个数据元素及若干指向其子树的分支。
结点的度:结点拥有的子树数。
叶子(或终端)结点:度为零的结点。
分支(或非终端)结点:度大于零的结点树的度:树中所有结点的度的最大值结点的层次:根结点的层次为1,第l层的结点的子树的根结点的层次为l+1。
树的深度:树中叶子结点所在的最大层次。
任何一棵非空树是一个二元组Tree = (root,F)其中:root 被称为根结点F 被称为子树森林二、二叉树1、二叉树的定义是n(n>=0)个结点的有限集合,它或为空树(n=0),或由一个根结点和至多两棵称为根的左子树和右子树的互不相交的二叉树组成。
注:二叉树中不存在度大于2的结点,并且二叉树的子树有左子树和右子树之分。
2、二叉树的五种基本形态:空树只含根结点右子树为空树左子树为空树左右子树均不为空树3、二叉树的性质性质1 :在二叉树的第i层上至多有2i-1个结点(i≥1)。
其中2i-1为2的i-1次方性质2:深度为k 的二叉树上至多含2k-1个结点(k≥1)。
其中2k-1为2的k次方减一性质3:对任何一棵二叉树,若它含有n0个叶子结点、n2个度为2的结点,则必存在关系式:n0 = n2+1。
证明:设二叉树上结点总数n = n0 + n1 + n2,∵二叉树上分支总数b = n1+2n2,①而 b = n-1 = n0 + n1 + n2–1 ②由①②,n0 = n2 + 1。
除根结点外,其余结点都有一个分支进入,设b为分支总数,则n=b+1性质4:具有n个结点的完全二叉树的深度为⎣ log2n⎦+1。
其中⎣ log2n⎦为不大于log2n的最大整数性质5:若对含n个结点的完全二叉树从上到下且从左至右进行 1 至n的编号,则对完全二叉树中任意一个编号为i的结点:(1)若i=1,则该结点是二叉树的根,无双亲,否则,编号为⎣i/2⎦的结点为其双亲结点;(2)若2i>n,则该结点无左孩子,否则,编号为2i的结点为其左孩子结点;(3)若2i+1>n,则该结点无右孩子结点,否则,编号为2i+1 的结点为其右孩子结点。
4、两类特殊的二叉树:满二叉树:指的是深度为k且含有2k-1个结点的二叉树。
其中2k-1为2的k次方减一特点:是每一层上的结点数都是最大结点数。
完全二叉树:树中所含的n 个结点和满二叉树中编号为1至n 的结点一一对应。
特点:⑴叶子结点只可能在层次最大的两层出现;⑵对任一结点,若其右分支下的子孙的最大层次为l,则其左分支下的子孙的最大层次为l或l+1。
性质练习:1. 一棵二叉树在其第五层中有17个结点,可不可能?第i层上至多有2i-1个结点,则25-1=16。