1、2018/10/18,大学计算机基础,1,第5章 数据结构,数据结构的基本概念 线性表及其存储结构 栈及其存储结构 队列及其存储结构 树和二叉树 查找 排序,2018/10/18,大学计算机基础,2,5.1.1 基本术语 数据(Data):是对信息的一种符号表示。在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。如:声音、图像等 数据元素(Data Element):是数据的基本单位,在计算机程序中通常作为一个整体进行考虑和处理。一个数据元素可由若干个数据项组成。数据项是数据的不可分割的最小单位。 如图书登记信息数据、学生信息,5.1 数据结构的基本概念,2018/10/1
2、8,大学计算机基础,3,数据结构(Data Structure):是相互之间具有一种或多种关联的数据元素的集合。 数据结构的研究内容 1) 数据的逻辑结构 2) 数据的存储结构 3) 数据结构的运算,5.1 数据结构的基本概念,2018/10/18,大学计算机基础,4,1)数据的逻辑结构数据的逻辑结构是用来描述数据元素在逻辑上的关联关系的。它是数据的组织形式,与数据在计算机内的存储方式无关。常用的数据的逻辑结构有:集合、线性结构、树状结构、图状结构等。例:有一个包含了4个元素的数据集合:小学,初中,高中,大学。,2018/10/18,大学计算机基础,5,数据元素之间的前后位置关系称为前后件关系
3、,也称为直接前驱和直接后继关系。所以,数据的逻辑结构描述了两个方面的信息:描述数据元素的信息;描述数据元素之间的前后件关系的信息。,2018/10/18,大学计算机基础,6,2)数据的存储结构数据的逻辑结构在计算机存储器中的存储方式就是数据的存储结构(也称数据的物理结构)。基本的存储结构有:顺序存储结构、链式存储结构、索引存储结构、散列存储结构。,2018/10/18,大学计算机基础,7,3)数据结构的运算数据结构的运算:即对数据施加的操作。一般包括:插入、删除、查找、分类、合并、分解、复制、修改等。,2018/10/18,大学计算机基础,8,5.1.2 数据结构的表示 1) 二元关系表示法
4、2) 图形表示法,2018/10/18,大学计算机基础,9,1) 二元关系表示法 形式: B=(D,R)其中, B表示数据结构,D表示数据元素的集合,R表示各数据元素之间前后件关系的集合。,2018/10/18,大学计算机基础,10,例1:求学历程 B=(D,R)D= 小学,初中,高中,大学R= (小学,初中),(初中,高中),(高中,大学)例2:我国的行政区划分B=(D,R)D= 中国,省,自治区,直辖市,北京,天津,上海,重庆R= (中国,省),(中国,自治区),(中国,直辖市),(直辖市,北京), (直辖市,天津), (直辖市,上海), (直辖市,重庆),2018/10/18,大学计算机
5、基础,11,2) 图形表示法每一个数据元素均表示为一个矩形框,称为结点;每一个前后件关系表示为一个带箭头的有向线段,从前件结点指向后件结点。,2018/10/18,大学计算机基础,12,例1:求学历程 例2:我国的行政区划分,小学,初中,高中,大学,中国,直辖市,重庆,上海,天津,北京,自治区,省,2018/10/18,大学计算机基础,13,5.1.3 线性结构和非线性结构 如果一个数据结构中没有任何数据元素,则称该数据结构为空数据结构。对于一个非空的数据结构来说,如果满足以下三个条件:有且只有一个根结点; 每个结点最多有一个前件结点,也最多有一个后件结点; 插入或删除任何一个结点后仍然同时满
6、足前两个条件。则称这样的结构为线性结构,又称线性表,否则为非线性结构。,2018/10/18,大学计算机基础,14,求学历程 (线性结构图形表示)我国的行政区划分(非线性结构),小学,初中,高中,大学,中国,直辖市,重庆,上海,天津,北京,自治区,省,2018/10/18,大学计算机基础,15,线性表的基本概念 线性表的顺序存储结构 线性表的链式存储结构,5.2 线性表及其存储结构,2018/10/18,大学计算机基础,16,线性表的基本概念线性表(Linear List) :由n(n0)个具有相同特性的数据元素组成的有序序列。例1、26个英文字母组成的字母表(A,B,C、Z)注意: 数据元素
7、的个数n称为线性表的长度。 当n=0时称为空表。 常常将非空的线性表(n0)记作: (a1,a2,an) 其中,ai(1in)是线性表中的一个数据元素,也称作结点。,2018/10/18,大学计算机基础,17,例2、学生健康情况登记表如下:,数据元素,2018/10/18,大学计算机基础,18,2. 线性表的顺序存储结构 1) 顺序表基本结构顺序表就是按照线性表各结点的逻辑次序把各点依次存放到一组连续的存储单元里。因此,在线性表的顺序存储结构中,前后相邻的两个数据元素在计算机的存储空间中也是前后相邻的,且前后位置关系跟逻辑关系一致。在程序设计语言中,一般用一维数组实现顺序表。,2018/10/
8、18,大学计算机基础,19,对于顺序表,可以用公式计算出任一元素的存储位置。如果第一个数据元素存放位置为LOC(a i),每个元素需占用 个存储单元,则线性表中第i+1个数据元素的存储位置和第i个数据元素的存储位置之间满足下列关系:LOC(a i+1)=LOC(a i)+线性表的第i个数据元素ai的存储位置为:LOC(ai)=LOC(a1)+(i-1)*,LOC(a1),LOC(a1)+,LOC(ai)=LOC(a1)+(i-1)*,LOC(an)=LOC(a1)+(n-1)*,2018/10/18,大学计算机基础,20,2)顺序表的运算顺序表的运算主要有:插入、删除、查找、排序、分解、合并和
9、逆转。排序和查找将在后面介绍,这里介绍一下插入和删除运算。,2018/10/18,大学计算机基础,21,插入运算,1 2 3 4 5,1 2 3 4 5 6,插入31,插入前n=5,插入后n=6,注:平均情况下,顺序表的插入运算需要移动表中一半的元素。,动画:顺序表的插入.swf,2018/10/18,大学计算机基础,22,删除运算,1 2 3 4 5,1 2 3 4 5 6,删除46,删除前n=5,删除后n=4,注:平均情况下,顺序表的删除运算需要移动表中一半的元素。,动画:顺序表的删除.swf,练习,一个顺序表(a1,a2an) 其长度是( ) 在ai和ai+1之间插入一个新元素,需要移动
10、()个元素 若每个元素占有4个字节,第一个元素存放的起始地址是3000,则第100个元素存放在(),2018/10/18,23,n,n-i,3000+(100-1)*4=3396,2018/10/18,大学计算机基础,24,3. 线性表的链式存储结构 1) 线性链表基本结构线性链表是用任意的存储单元存储线性表的各个数据元素的。与顺序表不同,这组存储单元可以是连续的存储空间,也可以是不连续的,甚至是零散的。对于线性链表来说,各数据元素的逻辑顺序与存储顺序未必一致。,2018/10/18,大学计算机基础,25,线性链表采用结点表示数据元素。每个结点有两个组成部分:数据域和指针域数据域:存储数据元素
11、的信息;指针域:存储数据元素间的前后件关系的信息,一般用指针指示直接后继元素或直接前驱元素的存储位置。,2018/10/18,大学计算机基础,26,指向第一个结点的指针称为头指针。线性链表分为单链表、循环链表和双向链表。,2018/10/18,大学计算机基础,27,2) 单链表及其运算单链表的每个结点有两个域:一个数据域和一个指针域。指针域中存储的是直接后继元素的存储位置。,i,存储序号 数据域 指针域,2018/10/18,大学计算机基础,28,例:线性表(A,B,C,D,E)的单链表存储结构。,head,单链表的逻辑结构,head,916356672,单链表的存储结构,存储序号 数据域 指
12、针域,2018/10/18,大学计算机基础,29,单链表的运算主要有:查找、插入和删除运算。 查找运算基本方法:从头指针指向的第一个结点开始沿着指针链依次向后搜索,逐个检查每个结点的数据域是否是指定元素,若是则返回该结点的地址,否则返回NULL。 例如:在下面的链表中查找存在D吗?,head,2018/10/18,大学计算机基础,30,插入运算在单链表的第i个元素之后插入一个新元素x的基本方法是: 在单链表中查找到要插入的位置; 生成一个新结点存储新元素x; 将新结点插入到指定位置,更改相应元素指针域。,插入新元素x之后,头指针,动画:单链表的插入.swf,2018/10/18,大学计算机基础
13、,31,删除运算要删除单链表中第i个元素的基本方法是: 在单链表中查找到要删除的元素; 更改相应元素的指针域,将第i-1个结点的指针域不再指向原来的第i个结点,改为指向第i+1个结点; 将要删除的结点移除。,头指针,动画:单链表的删除.swf,2018/10/18,大学计算机基础,32,链表的特点,数据元素不必连续存储 不能随机访问数据元素 插入、删除操作方便,不用移动数据元素,2018/10/18,33,练习,若某线性表中最常用的操作是读取第n个元素和找第n个元素的前驱元素,则采用 存储方式最节省时间。A、顺序表 B、单链表,2018/10/18,大学计算机基础,34,栈的基本概念 栈的顺序
14、存储结构 栈的链式存储结构,5.3 栈及其存储结构,2018/10/18,大学计算机基础,35,1. 栈的基本概念 栈是一种特殊的线性表。 栈是指一端封闭,只允许在另一端插入或删除元素的线性表。 封闭的一端称为栈底,允许插入或删除元素的一端称为栈顶。 向栈中插入元素的过程称为入栈运算或进栈运算;从栈中删除元素的过程称为出栈运算或退栈运算。,栈顶top,栈底bottom,出栈,入栈,2018/10/18,大学计算机基础,36,栈中没有任何元素称为空栈。 对于非空栈,处于栈顶的元素称为栈顶元素,处于栈底的元素称为栈底元素。 栈是“先进后出”(first in last out, FILO)或“后进
15、先出”(last in first out, LIFO)表。 栈具有记忆功能。,2018/10/18,大学计算机基础,37,2. 栈的顺序存储结构栈的顺序存储结构也称为顺序栈,它是一种运算受限的顺序表。对顺序栈可以有3种基本运算:入栈、出栈、读栈顶元素,top,bottom,5 4 3 2 1,stack.swf,2018/10/18,大学计算机基础,38,(1)入栈运算向栈中插入元素的过程称为入栈运算。 基本方法是: 将栈顶指针top向栈顶方向移动一个存储单元; 将要插入的元素插入到栈顶指针top指向的存储位置。,top,bottom,5 4 3 2 1,(a) 初始栈,bottom,5 4
16、 3 2 1,D,E,D入栈,E入栈,2018/10/18,大学计算机基础,39,说明:在执行入栈运算前,如果栈本身已经是满栈,即栈顶指针已经指向了栈存储空间的最后一个位置时,如果继续插入新元素,就会发生“上溢”错误。所以,要求在执行入栈运算前,必须先要判断栈内是否还有空间可以容纳新的元素插入。,2018/10/18,大学计算机基础,40,(2)出栈运算 指从栈顶删除一个元素并把它的值赋给某个变量。 基本方法是: 将栈顶元素赋值给指定变量; 将栈顶指针top向栈底方向移动一个存储单元。,top,bottom,5 4 3 2 1,(a) 初始栈,bottom,5 4 3 2 1,D出栈,n,D,
17、2018/10/18,大学计算机基础,41,说明:出栈时,原栈顶元素不必真正擦除,只需移动栈顶指针即可,原栈顶元素在下次入栈运算之前仍然存在。在执行出栈运算前,如果栈是空栈,即栈顶指针为0时,已经没有元素可以删除,如果还要执行出栈运算,则会发生“下溢”错误。同样,也需要在执行出栈运算前,先检查栈顶指针所指的位置。,2018/10/18,大学计算机基础,42,(3)读栈顶元素 读栈顶元素就是将栈顶元素的值赋给某个指定变量。说明: 它与出栈运算的差异在于不用移动栈顶指针的位置,即不删除栈顶元素。 当栈顶指针top为0时,无法读取栈顶元素。,2018/10/18,大学计算机基础,43,例题:,如果入
18、栈的序列是a、b、c、d,入栈和出栈可以交叉进行,则下列出栈序列中不可能的是: 1)a、b、c、d 2)b、c、d、a 3)c、a、d、b 4)c、d、b、a,答案:3)是不可能的,2018/10/18,44,设栈S的初始状态为空,6个元素入栈的顺序为A,B,C,D,E,F,若出栈的顺序是B,E,D,C,F,A,则栈S的容量至少应该是 。,2018/10/18,大学计算机基础,45,3. 栈的链式存储结构栈的链式存储结构也称为链栈,它可以看作一种运算受限的线性链表,插入和删除操作只允许在线性链表的一端进行。,top,(a) 链栈的逻辑示意图,2018/10/18,大学计算机基础,46,(1)入
19、栈运算 链栈的入栈运算就是向链栈中插入一个新的元素。 基本方法是: 先为新元素分配一个结点; 结点的数据域存储新元素的值; 结点的指针域指向原栈顶元素; 改变栈顶指针,使之指向新元素的结点。,2018/10/18,大学计算机基础,47,(2)出栈运算 从链栈的栈顶处删除一个元素。 基本方法是: 读取栈顶元素,将其赋值给指定变量; 改变栈顶指针,使其指向原栈顶元素结点的后继结点; 释放原栈顶元素空间。,n,P,2018/10/18,大学计算机基础,48,队列的基本概念 队列的顺序存储结构 队列的链式存储结构,5.4 队列及其存储结构,2018/10/18,大学计算机基础,49,1. 队列的基本概
20、念 队列也是一种运算受限的特殊线性表。 队列只允许在表的一端插入元素,在另一端删除元素。 允许插入元素的一端称为队尾,允许删除元素的一端称为队头。用队头指针指向队头元素的前一位置。 向队列的队尾插入元素的过程称为入队运算或进队运算;从队列的队头删除元素的过程称为出队运算或退队运算。,队头指针front,队尾rear,出队,入队,队头元素,2018/10/18,大学计算机基础,50,队列中没有任何元素时称为空队列。 对于长度不为0的非空队列,处于队头的元素称为队头元素,处于队尾的元素称为队尾元素。 队列是“先进先出”(first in first out, FIFO)或“后进后出”(last i
21、n last out, LILO)表。 队列中的元素的出队顺序与入队顺序完全相同。,2018/10/18,大学计算机基础,51,2. 队列的顺序存储结构队列的顺序存储结构也称为顺序队列。一般顺序队列的运算有入队运算和出队运算两种。,对头元素,4 3 2 1 0,(a) 初始队列,rear,2018/10/18,大学计算机基础,52,(1)入队运算只涉及尾指针rear的变化。 基本方法是: 将队尾指针rear向队尾方向移动一个存储单元;rear=rear+1 将要插入的元素插入队尾指针rear指向的存储位置。,4 3 2 1 0,说明:入队运算时,如果队满或尾指针已经指向了队列存储空间的最后一个
22、位置,若继续插入新元素,就会发生“上溢”错误。,D,2018/10/18,大学计算机基础,53,(2)出队运算 只涉及头指针front的改变。 基本方法是: 将队头元素赋值给指定变量 将头指针front向队尾方向移动一个存储单元。front=front+1,rear,4 3 2 1 0,说明:在执行出队运算时,如果队列是空队,继续删除元素,则会发生“下溢”错误。,n,A,2018/10/18,大学计算机基础,54,注意:在实际应用中,由于顺序队列队头删除元素所在的空间常被闲置,造成资源的浪费,为解决这个问题,一般顺序队列常采用循环队列的形式。,4 3 2 1 0,n,A,B,E,2018/10
23、/18,大学计算机基础,55,循环队列 循环队列就是将队列的首尾相连构成一个逻辑上的环状空间,能够循环存储队列中的数据元素。 循环队列中,依然是尾指针rear指向队尾元素,头指针front指向队头元素的前一个位置。,队头front,队尾rear,2018/10/18,大学计算机基础,56,(1)入队运算循环队列的入队运算也是指在队尾加入一个新元素的过程。 基本方法是: 将队尾指针rear向队尾方向移动一个存储单元rear=(rear+1) mod n; 将要插入的元素插入队尾指针rear指向的存储位置。,问题:什么时候代表队列满了? 答案:当rear=front时 当队列是满状态,如果进行入队
24、运算,就会发生“上溢”错误。,4 3 2 1 0,E,F,G,2018/10/18,大学计算机基础,57,(2)出队运算循环队列的出队运算也是指将队头元素删除的过程。 基本方法是: 将队头元素赋值给指定变量; 将头指针front向队尾方向移动一个存储单元,有front=(front+1) mod n。,4 3 2 1 0,n,C,说明:当front=rear时,队列空。循环队列是空状态时,继续删除元素,就会发生“下溢”错误。,D,E,A,当循环队列空或满时,都有front= rear。为了区分队列空或满的状态,增加了一个标志量flag,所以当循环队列为空时,有flag=0且front= rea
25、r同时成立,当循环队列为满时,有flag=1且front= rear同时成立。,2018/10/18,大学计算机基础,58,例题:,一个大小为7的循环队列(06),当前的front和rear的值分别是3和0,若先从当前队列中删除一个元素,再加入3个元素后,rear和front的值分别是多少。,答案:front是4,rear是3,2018/10/18,59,练习,在一个容量为15的循环队列中(014),若头指针front=6,尾指针rear=9,则该循环队列中共有几个元素? 在一个容量为15的循环队列中(014),若头指针front=9,尾指针rear=6,则该循环队列中共有几个元素?,2018
26、/10/18,大学计算机基础,60,3. 队列的链式存储结构队列的链式存储结构也称为链队列,它也是一种运算受限的线性链表,入队和出队操作必须在线性链表的不同端进行。,rear,(a) 链队列的逻辑示意图,头指针 front,头结点,2018/10/18,大学计算机基础,61,(1)入队运算链队的入队运算就是向链队中插入一个新的元素。 基本方法是: 先为新元素分配一个结点; 结点的数据域存储新元素的值; 结点的指针域设置为空; 尾结点的指针域指向新元素的结点; 改变尾指针,使之指向新元素的结点。,front,2018/10/18,大学计算机基础,62,(2)出队运算链队的出队运算就是从链队的队头
27、处删除一个元素。 基本方法是: 读取队头元素,将其赋值给指定变量; 改变头结点的指针域,使其指向原队头元素结点的后继结点; 释放原队头元素空间。,rear,front,n,A,2018/10/18,大学计算机基础,63,树的基本概念 二叉树的定义 二叉树的性质 二叉树的存储结构 二叉树的遍历,5.5 树和二叉树,2018/10/18,大学计算机基础,64,树状结构是一种重要的非线性结构。它的形状类似于现实中倒立的树,结点间呈现分支和层次关系,能够方便地描述数据之间一对多的联系。,1. 树的基本概念,2018/10/18,大学计算机基础,65,树结构 (除了一个称为根的结点外)每个元素都有且仅有
28、一个直接前趋,有零个或多个直接后继。,根结点,2018/10/18,大学计算机基础,66,树形结构常用的术语,根结点:最上层的没有前件结点的结点。 叶子结点:没有后件结点的结点。 内部结点:既有前件结点又有后件结点的结点。 父结点:某一结点的前件结点称为该结点的父结点。 子结点:某一结点的后件结点称为该结点的子结点。 子树:以某个结点的一个子结点为根的树称为该结点的子树。 结点的度:某个结点连接的子结点的个数称为该结点的度。 树的度:一颗树包含的所有结点的度的最大值称为这棵树的度。 树的深度:树的最大层次数称为树的深度。,2018/10/18,大学计算机基础,67,结点A的度: 3 结点B的度
29、: 2 结点M的度:0,叶子结点:K,L,F,G,M,I,J,结点A的子结点:B,C,D 结点B的子结点:E,F,结点I的父结点: D 结点L的父结点:E,树的度:3,树的深度:4,根结点:A,子树,2018/10/18,大学计算机基础,68,2. 二叉树的定义,二叉树是一种重要的树状结构。 二叉树是n(n0)个结点的有限集合,具有两个特点: 如果二叉树非空,则有且只有一个根结点; 每个结点最多有两个子结点,分别以这两个子结点作为根结点组成该结点的左子树和右子树。 二叉树的度为2。,右子树,左子树,根结点,2018/10/18,大学计算机基础,69,(a),(b),(a)、(b)是不是相同的二
30、叉树?(a)的左子树有四个结点(b)的左子树有两个结点,2018/10/18,大学计算机基础,70,二叉树的5种基本形态:,空二叉树,仅有根结点的二叉树,右子树为空的二叉树,左、右子数均为非空的二叉树,左子树为空的二叉树,2018/10/18,大学计算机基础,71,练习题,由3个结点可以构造出多少种不同的二叉树?,答案:共5种,2018/10/18,大学计算机基础,72,满二叉树,满二叉树是指除了最后一层外,每一层的结点都有两个子结点的二叉树。也就是说,在满二叉树的任何一层上,结点的数目都达到最大值。,深度为3的满二叉树,深度为2的满二叉树,2018/10/18,大学计算机基础,73,完全二叉
31、树,如果一棵二叉树最多只有最下面的2层结点度数可以小于2,并且最下层结点都集中在该层的最左端,则称为完全二叉树;,完全二叉树是二叉树的特例满二叉树又是完全二叉树的特例,2018/10/18,大学计算机基础,74,指出正确的完全二叉树,2018/10/18,大学计算机基础,75,3. 二叉树的性质,性质1 二叉树的第k层上最多有2k-1(k1)个结点。当二叉树为满二叉树时取得极限值。 性质2 深度为m的二叉树最多有2m-1(m 1) 个结点。 性质3 二叉树中度为0的结点数n0和度为2的结点数n2满足n0=n2+1。 性质4 具有n个结点的二叉树,深度h满足hlog2n+1,当二叉树为完全二叉树
32、时取得极限值h=log2n+1,其中log2n表示取小于等于log2n的最大整数。,2018/10/18,大学计算机基础,76,3. 二叉树的性质,性质5 具有n个结点的完全二叉树,如果从根结点开始,按层序编号,则对任一编号为i(i=1,2,n)的结点,有 若i=1,则该结点为根结点;若i1,则该结点的父结点的编号为INT(i/2)。 若2in,则编号为i的结点有左子结点,左子结点的编号为2i,否则该结点是叶子结点。 若2i+1n,则编号为i的结点有右子结点,右子结点的编号为2i+1,否则该结点没有右子结点。,2018/10/18,大学计算机基础,77,练习题,1、深度为9的二叉树最多有多少个
33、结点? 答案:29-1=511个 2、若完全二叉树具有85个结点,则它的非叶子结点个数是多少? 答案:42个。 n0+n1+n2=85, n1=0(根据完全二叉树的定义每层为奇数个数结点的层数为第1层,最后1层也有可能) n0=n2+1,2018/10/18,78,设深度为h的二叉树上只有度为0和度为2的结点,则此二叉树中所包含的结点数至少为 。A、2h B、2h-1 C、2h+1 D、h+1,2018/10/18,大学计算机基础,79,4. 二叉树的存储结构,二叉树通常有两种存储方式:顺序存储结构和链式存储结构,由于顺序存储结构局限性较大,而且空间浪费严重,所以一般采用的是链式存储结构,也称
34、二叉链表。 与线性表类似,二叉链表中的每个存储结点也是由数据域和指针域组成。,存储序号 左指针域 数据域 右指针域,i,2018/10/18,大学计算机基础,80,(a) 二叉树,(b) 二叉链表的逻辑状态,2018/10/18,大学计算机基础,81,5. 二叉树的遍历,二叉树的遍历是指沿某条路径不重复地访问二叉树中的所有结点。这里的访问是指对结点进行某种处理,如读、写、改等。二叉树遍历过程中涉及访问根结点、遍历左子树和遍历右子树3种操作。根据对根结点访问先后的不同,可以将二叉树的遍历分为前序遍历、中序遍历和后序遍历3种类型。,前序遍历 DLR 前序遍历是是一个递归过程,若二叉树为空,则结束返
35、回,对于非空的二叉树,其遍历规则如下: (1)访问根结点; (2)前序遍历左子树; (3)前序遍历右子树;,前序遍历序列 A,例:前序遍历右图所示的二叉树(1)访问根结点A(2)前序遍历左子树:即按DLR的顺序遍历左子树(3)前序遍历右子树:即按DLR的顺序遍历右子树,B,D,E,G,C,F,中序遍历 LDR 中序遍历也是一个递归过程,若二叉树为空,则结束返回,对于非空的二叉树,其遍历规则如下: (1)对称遍历左子树 (2)访问根结点 (3)对称遍历右子树,对称序遍历序列: D,B,G,E,例:对称遍历右图所示的二叉树(1)对称遍历左子树:即按LDR的顺序遍历左子树(2)访问根结点A(3)对称
36、遍历右子树:即按LDR的顺序遍历右子树,A,C,F,后序遍历LRD 后序遍历也是一个递归过程,若二叉树为空,则结束返回,对于非空的二叉树,其遍历规则如下: (1)后序遍历左子树 (2)后序遍历右子树 (3)访问根结点,后序遍历序列: D,G,E,B,例:后序遍历右图所示的二叉树(1)后序遍历左子树:即按LRD的顺序遍历左子树(2)后序遍历右子树:即按LRD的顺序遍历右子树(3)访问根结点A,F,C,A,2018/10/18,大学计算机基础,85,练习题,某二叉树中序遍历结果是DFEBAC,后序遍历结果是FDCABE,则它的前序遍历结果是什么?,答案:EDFBAC 第一:确定根结点 E 第二:确
37、定根结点的左右子树 DF 、 BAC 第三:确定第二层结点 D、 B 第四:确定各子树结点 F、 A,2018/10/18,86,练习,一颗二叉树的前序遍历序列为ABDGCFK,中序遍历序列为DGBAFCK,则结点的后序遍历序列为 。,2018/10/18,87,练习,一颗二叉树的后序遍历序列为DACBE,中序遍历序列为DEBAC,则结点的前序遍历序列为 。,2018/10/18,大学计算机基础,88,查找就是指在某种数据结构中找到某个指定元素的过程。 若从数据结构中找到了指定的元素,则称查找成功,否则称为查找失败。 查找的主要操作是元素的比较。 通常把查找过程中元素的比较次数作为衡量一个查找
38、算法效率高低的标准。 常用的查找方法: 顺序查找 二分查找,5.6 查找,2018/10/18,大学计算机基础,89,1. 顺序查找,顺序查找是线性表的最简单的查找方法。 顺序查找的基本方法是:从线性表的一端开始依次扫描每个元素,与指定元素进行比较,如果相等,则查找成功,给出元素在表中的位置,如果全部元素扫描完后,仍然没有找到与指定元素相等的,则查找失败。,2018/10/18,大学计算机基础,90,优点:算法简单。 缺点:查找效率比较低。顺序查找长度为n的线性表,最好情况下做1次比较,最坏情况下要做n次比较。平均情况下做(n+1)/2次比较。,有些情况只能采用顺序查找:线性表无序、线性链表。
39、,2018/10/18,大学计算机基础,91,2. 二分查找,二分查找又称折半查找,是一种比顺序表效率高的线性查找方法。 要求线性表必须是有序的 。,2018/10/18,大学计算机基础,92,例 L2=( 3,12,24,37,45,53,61,78,90,100 ),查找 Key=24的记录,24 45 继续在前半个表中用二分查找法查找,24 12 继续在后半个表中用二分查找法查找,查找成功,mid=(low+high)/2,2018/10/18,大学计算机基础,93,二分查找的基本方法是:首先将线性表的中间元素与指定元素进行比较,如果相等,则查找成功, 如果不相等,需要进一步判断被查元素
40、与中间元素的大小, 如果被查元素大于中间元素,则要在元素值较大的子表中继续使用二分法继续查找, 如果被查元素小于中间元素,则要在元素值较小的子表中继续使用二分法继续查找,直到查找成功或查找失败。,2018/10/18,大学计算机基础,94,二分法查找的优缺点:优点:算法简单。 缺点:查找效率比较低。用二分方法查找长度为n的有序线性表,最坏情况下比较次数为log2n+1次。,2018/10/18,大学计算机基础,95,练习题,有一个有序线性表(4,7,8,14,16,19,23,25,33,36,37)中,用二分查找法查找元素15,需要比较的次数为多少,查找33的比较次数是多少?,答案:查找15
41、比较4次查找33比较2次,2018/10/18,大学计算机基础,96,插入类排序 交换类排序 选择类排序,5.7 排序,排序是计算机内经常进行的一种操作,其目的是将一组“无序”的记录序列调整为“有序”的记录序列。,2018/10/18,大学计算机基础,97,1. 插入类排序,主要思想:每次将一个待排序列中的元素插入到已经有序的序列的适当位置,使插入后的序列仍然是个有序序列,直到将待排序列的所有元素都插入完为止。常用的插入类排序是: 简单插入排序 希尔排序,2018/10/18,大学计算机基础,98,简单插入排序,简单插入排序,也叫直接插入排序,是一种简单的排序方法。 简单插入排序的基本思想是:
42、 将待排序列的第一个元素看作一个有序序列, 在有序表中找到第二个元素应插入的位置,移动相应元素空出该位置,然后将待排序列的第二个元素放置于此,从而使插入新元素后的线性表仍然保持有序, 依次类推,将待排序列后面的元素逐个插入有序序列,直到最后。,2018/10/18,大学计算机基础,99,简单插入排序过程:,初始序列 35 28 46 17 15 一次插入后 28 35 46 17 15 二次插入后 28 35 46 17 15 三次插入后 17 28 35 46 15 最后结果 15 17 28 35 46,最坏情况下,需要比较的次数为n(n-1)/2次。时间复杂度:T(n)=O(n),201
43、8/10/18,大学计算机基础,100,希尔排序,希尔排序又称缩小增量排序,它是对简单插入排序的改进。 基本思想是: 首先按增量将待排序列的元素分组, 对同一分组内的元素执行插入排序, 然后逐渐缩小增量将待排序列分组, 执行上述过程,直到增量为1时,最后进行一次插入排序,此时得到的序列就是一个有序序列。,2018/10/18,大学计算机基础,101,例如:1 2 3 4 5 6 7 8 9 10 关键字:,49 38 65 97 76 13 27 49 55 04,第一趟希尔排序,设增量 d =5, 分为5组,各组内进行直接插入排序,13 27 49 55 04 49 38 65 97 76,
44、第二趟希尔排序,设增量 d =3, 分为3组,各组内进行直接插入排序,13 04 49 38 27 49 55 65 97 76,04 13 27 38 49 49 55 65 76 97,第三趟希尔排序,设增量 d =1, 分为1组,各组内进行直接插入排序,2018/10/18,大学计算机基础,102,习题:,设有关键码序列(17,8,3,25,16,1,13,19,18,4,6,21),要按关键码值递增的次序排序,用初始增量为4的希尔排序法,一趟扫描后的结果是 。,答案:16,1,3,19,17,4,6,21,18,8,13,25,2018/10/18,大学计算机基础,103,2. 交换类
45、排序,交换类排序的主要思想是:每次比较待排序列的两个元素,如果这两个元素的值的次序与排序要求的次序相反时,则交换两者的位置,直到整个序列全部有序为止。常用的交换类排序是: 冒泡排序 快速排序,2018/10/18,大学计算机基础,104,冒泡排序,冒泡排序的基本思想是:相邻的两个元素进行比较,满足条件(与要排序的顺序相反)就交换。 一趟冒泡排序的结果是把最大(或最小)的放到了最后,就像重的东西沉到了水底(或轻的东西浮到了水面)。 对剩下的元素作相同的操作,直到整个线性表有序。对n个元素进行排序,冒泡的过程要n-1趟。,2018/10/18,大学计算机基础,105,例 用起泡排序法对以下记录进行
46、排序: 49、38、65、97、76、13、27、49,分析:,4938659776132749,3849659776132749,3849659776132749,3849659776132749,3849657697132749,3849657613972749,3849657613279749,3849657613274997,4938659776132749,一趟起泡排序,初始 状态,最大者沉底,下一趟只需排的记录,2018/10/18,大学计算机基础,106,起泡排序性能分析,最好情况(关键字在记录序列中顺序有序):只需进行一趟起泡“比较”的次数: “移动”的次数:n-1 0 最坏情
47、况(关键字在记录中逆序有序): 需进行n-1趟起泡,“比较”的次数:,“移动”的次数:,2018/10/18,大学计算机基础,107,习题,用冒泡排序算法对数据2,37,42,19,27,35,56,44,10进行从小到大排序,在将最大的数“沉”到最后时,数的顺序是 。,答案:2,37,19,27,35,42,44,10,56,2018/10/18,大学计算机基础,108,快速排序,快速排序又称划分交换排序,它能够通过比较不相邻的两个元素从而一次消除多个逆序。 基本思想是 (由小到大) 在待排序的线性表中任选一个元素T 以它为基准比较表中的所有元素,通过交换将线性表中比T大的元素都放在T的后面
48、,比T小的元素都放在T的前面,从而将整个表分解成三部分: 比T小的元素组成的子表、 T、比T大的元素组成的子表。 然后再将前后两个子表重复上述过程,直到整个线性表有序。,被指定的关键字,从后向前,将关键字与49比较,直至遇到小于49的关键字,前移,从后向前,将关键字与49比较,直至遇到小于49的关键字,前移,从前向后,将关键字与49比较,直至遇到大于49的关键字,后移,从前向后,将关键字与49比较,直至遇到大于49的关键字,后移,从后向前,将关键字与49比较,直至遇到i=j,将49放至i处,49,一趟快速排序结束,快速排序过程:,27 38 13 49 76 97 65 4913 27 38 49 49 65 76 9713 27 38 49 49 65 76 9713 27 38 49 49 65 76 97,两趟快速排序结束,三趟快速排序结束,快速排序结束,2018/10/18,大学计算机基础,111,最坏情况下,当初始线性表已经有序时,快速排序退化为冒泡排序,比较n(n-1)/2次。,