数据结构基础知识1.根据数据元素间关系的基本特征,有四种基本数据结构:集合:数据元素间除“同属于一个集合”外,无其它关系。线性结构:一个对一个,如线性表、栈、队列。树形结构:一个对多个,如树。图状结构:多个对多个,如图。2.数据的存储结构一般有两种,用一组物理地址相邻的存储单元来存储数据元素的存储方式称之为顺序存储结构;借助于动态数据结构来存储数据元素的存储方式称之为链式存储结构。3.数组的存储一般采用的是顺序存储结构,如一维数组和多维数组。按照顺序往下存储数据。如图14.栈结构的特点是“先进后出”,如图2举例说明。5.队列结构的特点是“先进先出”,比如排队买票等,如图3举例说明。Vars:array[1..4,1..10]ofinteger;则说明数组s是二维的整型数组,每个元素占2字节,假设存储第一个元素的起始地址为100,则它的存储结构如下:地址存储方式100S[1,1]102S[1,2]……118S[1,10]120S[2,1]……178S[4,10](图1)栈结构就像一个底部封闭的线性表,比如进栈元素的顺序分别为1、2、3,则出栈元素的顺序分别是3、2、1,满足“先进后出”原则。进栈出栈(图2)队列结构就像底部不封闭的线性表,比如进队列元素的顺序是1、2、3,则出队列元素的顺序也是1、2、3,满足“先进先出”的原则。进队列出队列(图3)6.树结构:树是n(n=0)个结点的有限集。(1)任意一棵树,只有一个特定的称为根的结点(如图4中的A);当n1时,其余结点可分为m(m0)个互不相交的有限集,其中每一个集合本身又是一棵树,并且称为根的子树。(2)结点拥有的子树数称为结点的度。(如图4中的B所拥有的度为2)(3)度为0的结点称为叶子或终端节点。(如图4中的H、I、J、K等都是叶子结点)(4)度不为0的结点称为非终端结点或分支结点。(5)结点的层次从根开始定义起,根为第一层,根的分支为第二层,依此类推(如图4的树结构最大层次为4层)。树中结点的最大层次称为树的深度或高度。(如图4的树结构的深度或高度为4)(6)二叉树是一种特殊的树形结构,它的特点是每个结点至多只有两棵子树(即二叉树中不存在度大于2的结点),并且二叉树的子树有左右之分,其次序不能任意颠倒,所以二叉树是由根节点、左子树、右子树三个基本单元构成。(7)一棵深度为k的二叉树至多只有2k-1个结点,此二叉树称为满二叉树(如图4为深度为4的满二叉树),最少也有K个结点(如图5为深度为4的最小二叉树)。可以验证具有n个叶子结点的满二叉树共有2n-1个结点(如图5的满二叉树)。(8)在二叉树的第i层上至多有2i-1个结点。(9)树的遍历:按照根节点在访问中的先后位置,我们有三种树的遍历方式。(当然每次访问都是左子树在右子树的前面。)先序遍历(先访问根节点,再访问左子树,最后访问右子树):如图4的先序遍历为:A、B、D、H、I、E、J、K、C、F、L、M、G、N、O。中序遍历(先访问左子树,再访问根节点,最后访问右子树):如图4的中序遍历为:H、D、I、B、J、E、K、A、L、F、M、C、N、G、O。后序遍历(先访问左子树,再访问右子树,最后访问根节点):如图4的后序遍历为:H、I、D、J、K、E、B、L、M、F、N、O、G、C、A。由上面三种遍历树结构的方式可知,先序遍历最先访问的是根节点;后序遍历最后访问的是根节点;由中序遍历的根节点的位置可知,在根节点的左边全部都是根节点的左子树,在根节点的右边全部都是根节点的右子树。必须掌握,由任意两种树的遍历结果,能够画出该二叉树,然后根据该二叉树,写出另一种遍历结果。(10)哈夫曼树称为最优树,是一类带权路径长度最短的树。ABCDEFGHIJKLMNO(图4)ABCD(图5)7.图结构:图是由顶点集V和边集E组成,一般把图G记为G=(V,E)。(1)在图6中,边有方向性,我们称之为有向图,有向图的边称之为弧。在图7中,边没有方向性,即边v1,v2和v2,v1指的是同一条边,我们称之为无向图。(2)在有向图中,从某顶点出发的弧的数目称为该顶点的出度,到达某顶点的有向弧的数目称为该顶点的入度。(如图6的有向图中,顶点V1的出度为2,入度为1。)在无向图中,与顶点依附的边的条数称为该顶点的度。(如图7中,顶点V1的度为2。)(3)完全图定义:如果用n表示图中顶点数目,用e表示边或者弧的数目,则有:对于有向图,具有n(n-1)条弧的有向图称为有向完全图(任意两个顶点之间都有2条有向弧)对于无向图,具有n(n-1)/2条边的无向图称为完全图(任意两个顶点之间都有一条边。)(4)连通图定义:在无向图中,若图中任意两个顶点之间都存在路径,则称该无向图为连通图。在有向图中,对于任意两个顶点Vi和Vj(Vi≠Vj),若从Vi到Vj和从Vj到Vi之间均存在路径,则称该有向图为强连通图。(5)带权图定义:有时图的边往往与具有一定意义的数值有关,我们把这种与图的边相关的数称为边上的权。权可以表示从一个顶点到另一个顶点的距离、费用或代价等,由这种带权的边构成的图称为带权图。(6)图的遍历方式有两种:深度优先搜索和广度优先搜索。顶点V1V2V3V4(图6有向图)弧V1V2V43V5(图7无向图)V3边8.二分法查找:具体方法见课本P147~P148面。二分法查找(又称折半查找)算法如下:首先需要设三个指示器top、bot、mid,分别指向查找范围的顶部、底部和中间位置。假定有11个元素的有序数列(2,5,7,10,14,15,18,23,35,41,52),待查找数为41,则一开始top=1、bot=11、mid=(top+bot)div2=6,这是一定要bot大于top,接着进行判断:(1)如果x=a[mid],则表示找到;(2)如果xa[mid],则说明待查找数在top到mid-1之间,改变bot=mid-1;(3)如果xa[mid],则说明待查找数在mid+1到bot之间,改变top=mid+1;重复以上过程直到已经找到或无法查找为止。例如查找41,则只需查找3次即可找到。假设用二分法在有1000个数据的有序数组中查找某个数据,则最多只需查找10次即可。(因为2101000)9.排序:(1)在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是选择排序。(2)在待排序的数据表已经为有序时,快速排序算法花费时间反而多。10.设循环队列中数组的下标范围是1~n,其头尾指针分别为f和r,则其元素个数为(r-f+n)MODn。11.哈希表:12.相关练习习题:(1)数组A[30..100,20..100]以行优先的方式存储,每个元素占8个字节,且已知A[40,30]的地址为2000,则A[60,90]的地址为:___________如果以列优先存储,则为:___________(2)设栈S的初始状态为空,现有6个元素组成的序列{1,3,5,7,9,11},对该序列在S栈上依次进行如下操作(从序列中的1开始,出栈后不在进栈):进栈,出栈,进栈,进栈,进栈,进栈,出栈,进栈,问出栈的元素序列是:_________,栈顶指针的值为______栈顶元素为:__________(3)把中缀表达式写成后缀及前缀表达式1)(P+Q)*(A-B)/((C+D)/(E-F))-G后:_________________前:_________________2)A-C*D+B/E*(D/A)后:_________________前:_________________(4)根据后缀表达式,写出前缀及中缀表达式ABC/DE+GH-/*+前:_________________中:_________________备注:以上这两题实际上考查了数据结构中的表达式树(5)给出一棵二叉树的中序遍历:DBGEACHFI与后序遍历:DGEBHIFCA,画出此二叉树(6)A=11001010B,B=00001111B,C=01011100B,则A∨B∧C=()BA)01011110B)00001111C)01011100D)11001110E)11001010(7)对给定的整数序列(54,73,21,35,67,78,63,24,89)进行从小到大的排序时,采用快速排序的第一趟扫描的结果是A)(24,21,35,54,67,78,63,73,89)B)(24,35,21,54,67,78,63,73,89)C)(24,21,35,54,67,63,73,78,89)D)(21,24,35,54,63,67,73,78,89)(8)一棵n个结点的完全二叉树,则二叉树的高度h为A)n/2C)(log2n)/2C)[log2n]+1D)2n-1(9)设有一个含有13个元素的Hash表(0~12),Hash函数是:H(key)=key%13,其中%是求余数运算。用二次探查法解决冲突,则对于序列(8、31、20、33、18、53、27),则下列说法正确的是()。A)27在1号格子中B)33在6号格子中C)31在5号格子中D)20在7号格子中E)18在4号格子中(10)13.历届信息学奥赛试题中的数据结构试题:选择题中的数据结构试题:(1)(第10届)某车站呈狭长形,宽度只能容下一台车,并且只有一个出入口。已知某时该车站站台为空,从这一时刻开始出入记录为:“进出进进出进进进出出进出”。假设车辆入站的顺序为1,2,3……,则车辆出站的顺序为(E)A、1,2,3,4,5B、1,2,4,5,7C、1,3,5,4,6D、1,3,5,6,7E、1,3,6,5,7(2)(第10届)二叉树T,已知其前序遍历序列为1243576,中序遍历序列为4215736,其后序遍历序列为(B)A、4257631B、4275631C、4275361D、4723561E、4526371(3)(第10届)满二叉树的叶节点为N,则它的节点总数为(C)A、NB、2NC、2N-1D、2N+1E、2^N-1(4)(第10届)在下图,从端点(E)出发存在一条路径可以遍历图中的每条边一次,而且仅遍历一次(5)(第9届)一个高度为h的二叉树最小元素数目是(B)。A)2h+lB)hC)2h-1D)2hE)2h-l(6)(第9届)已知队列(13,2,11,34,41,77,5,7,18,26,15),第一个进入队列的元素是13,则第五个出队列的元素是(B)。A)5B)41C)77D)13E)18(7)(第8届)一个向量第一个元素的存储地址是100,每个元素的长度是2,则第5个元素的地址是(B)A)110B)108C)100D)109(8)(第8届)在所有排序方法中,关键字比较的次数与记录的初始排列次序无关的是(D)。A)希尔排序B)起泡排序C)插入排序D)选择排序AEDBC(9)(第7届)在顺序表(2,5,7,10,14,15,18,23,35,41,52)中,用二分法查找12,所需的关键码比较的次数为(C),用二分法查找41,所需的关键码比较此数为(B)。A)2B)3C)4D)5(10)(第7届)若已知一个栈的入栈顺序是1,2,3,…,n,其输出序列为P1,P2,P3,…,Pn,若P1是n,则Pi是(C)A)iB)n-1C)n-i+1D)不确定(11)(第6届)设循环队列中数组的下标范围是1~n,其头尾指针分别为f和r,则其元素个数为(D)A.r-fB.r-f+1C.(r-f)MODn+1D.(r-f+n)MODn(12)(第6届)在待排序的数据表已经为有序时,下列排序算法中花费时间反而多的是(D)A.堆排序B.C.冒泡排序D.快速排序(13)(第6届)某数列有1000个各不相同的单元,由低至高按序排列;现要对该数列进行二分法检索(binarysearch),在最坏的情况下,需检视(B)个单元A.1000B.10C.100D.500(14)(第6届)已知数组A中,每个元素A[I,J]在存贮时要占3个字节,设I从1变化到8,J从1变化到10,分配内存时是从地址SA开始连续按行存贮分配的。试问:A[5,8]的起始地址