1、20091.为解决计算机与打印机之间速度不匹配的问题,通常设置一个打印数据缓冲区,主机将要输出的数据依次写入该缓冲区,而打印机则依次从该缓冲区中取出数据。该缓冲区的逻辑结构应该是A.栈 B.队列 C.树 D.图2.设栈 S 和队列 Q 的初始状态均为空,元素 abcdefg 依次进入栈 S。若每个元素出栈后立即进入队列 Q,且 7 个元素出队的顺序是 bdcfeag,则栈 S 的容量至少是 A1 B.2 C.3 D.43.给定二叉树图所示。设 N 代表二叉树的根,L 代表根结点的左子树,R代表根结点的右子树。若遍历后的结点序列为 3,1,7,5,6,2,4,则其遍历方式是 ALRN B.NRL
2、 C.RLN D.RNL4.下列二叉排序树中,满足平衡二叉树定义的是5.已知一棵完全二叉树的第 6 层(设根为第 1 层)有 8 个叶结点,则完全二叉树的结点个数最多是A39 B.52 C.111 D.1196.将森林转换为对应的二叉树,若在二叉树中,结点 u 是结点 v 的父结点的父结点,则在原来的森林中,u 和 v 可能具有的关系是 I父子关系 II.兄弟关系 III.u 的父结点与 v 的父结点是兄弟关系A.只有 II B.I 和 II C.I 和 III D.I、II 和 III7.下列关于无向连通图特性的叙述中,正确的是I所有顶点的度之和为偶数 II.边数大于顶点个数减 1 III.
3、至少有一个顶点的度为 1A.只有 I B.只有 II C.I 和 II D.I 和 III8.下列叙述中,不符合 m 阶 B 树定义要求的是A根节点最多有 m 棵子树 B.所有叶结点都在同一层上C各结点内关键字均升序或降序排列 D.叶结点之间通过指针链接9.已知关键序列 5,8,12,19,28,20,15,22 是小根堆(最小堆),插入关键字 3,调整后得到的小根堆是A3,5,12,8,28,20,15,22,19B.3,5 ,12,19,20,15,22,8,28C3, 8,12,5,20,15,22,28,19D.3,12,5,8,28,20,15,22,1910.若数据元素序列 11,
4、12,13,7,8,9,23,4,5 是采用下列排序方法之一得到的第二趟排序后的结果,则该排序算法只能是A起泡排序 B.插入排序 C.选择排序 D.二路归并排序41.(10 分)带权图(权值非负,表示边连接的两顶点间的距离)的最短路径问题是找出从初始顶点到目标顶点之间的一条最短路径。假定从初始顶点到目标顶点之间存在路径,现有一种解决该问题的方法:设最短路径初始时仅包含初始顶点,令当前顶点 u 为初始顶点;选择离 u 最近且尚未在最短路径中的一个顶点 v,加入到最短路径中,修改当前顶点 u=v;重复步骤,直到 u 是目标顶点时为止。请问上述方法能否求得最短路径?若该方法可行,请证明之;否则,请举
5、例说明。42.(15 分)已知一个带有表头结点的单链表,结点结构为假设该链表只给出了头指针 list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第 k 个位置上的结点(k 为正整数)。若查找成功,算法输出该结点的 data 值,并返回 1;否则,只返回 0。要求:(1)描述算法的基本设计思想(2)描述算法的详细实现步骤(3)根据设计思想和实现步骤,采用程序设计语言描述算法(使用 C 或C+或 JAVA 语言实现),关键之处请给出简要注释。20101、若元素 a,b,c,d,e,f 依次进栈,允许进栈、退栈操作交替进行。但不允许连续三次进行退栈工作,则不可能得到的出栈序列是
6、( )A:dcebfa B:cbdaef C:dbcaef D:afedcb2、某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作,则不可能得到的顺序是( )A:bacde B:dbace C:dbcae D:ecbad3、下列线索二叉树中(用虚线表示线索),符合后序线索树定义的是( )4、在下列所示的平衡二叉树中插入关键字 48 后得到一棵新平衡二叉树,在新平衡二叉树中,关键字 37 所在结点的左、右子结点中保存的关键字分别是data link( ) A:13,48 B:24,48 C:24,53 D:24,905、在一棵度为 4 的树 T 中,若有 20 个度为 4 的结点,10
7、个度为 3 的结点,1 个度为 2 的结点,10 个度为 1 的结点,则树 T 的叶节点个数是( )A:41 B:82 C:113 D:1226、对 n(n 大于等于 2)个权值均不相同的字符构成哈夫曼树,关于该树的叙述中,错误的是( )A:该树一定是一棵完全二叉树B:树中一定没有度为 1 的结点C:树中两个权值最小的结点一定是兄弟结点D:树中任一非叶结点的权值一定不小于下一任一结点的权值7、若无向图 G-(V.E)中含 7 个顶点,则保证图 G 在任何情况下都是连通的,则需要的边数最少是( )A:6 B:15 C:16 D:218、对下图进行拓补排序,可以得到不同的拓补序列的个数是( )ab
8、cdeA:4 B:3 C:2 D:19、已知一个长度为 16 的顺序表 L,其元素按关键字有序排列,若采用折半查找法查找一个不存在的元素,则比较次数最多是( )A:4 B:5 C:6 D:710、采用递归方式对顺序表进行快速排序,下列关于递归次数的叙述中,正确的是( )A:递归次数与初始数据的排列次序无关B:每次划分后,先处理较长的分区可以减少递归次数C:每次划分后,先处理较短的分区可以减少递归次数D:递归次数与每次划分后得到的分区处理顺序无关11、对一组数据(2,12,16,88,5,10)进行排序,若前三趟排序结果如下( )第一趟:2,12,16,5,10,88第二趟:2,12,5,10,
9、16,88第三趟:2,5,10,12,16,88则采用的排序方法可能是:A:起泡排序 B:希尔排序 C:归并排序 D:基数排序41.( 10 分 ) 将 关 键 字 序 列 ( 7、 8、 11、 18、 9、 14) 散 列 存 储 到 散 列 列 表中 , 散 列 表 的 存 储 空 间 是 一 个 下 标 从 0 开 始 的 一 个 一 维 数 组 散 列 函 数 维 :H( key) =( key3) MODT, 处 理 冲 突 采 用 线 性 探 测 再 散 列 法 , 要 求 装 填 ( 载 )因 子 为 0.7问 题 : ( 1) 请 画 出 所 构 造 的 散 列 表 ;( 2
10、) 分 别 计 算 等 概 率 情 况 下 , 查 找 成 功 和 查 找 不 成 功 的 平 均 查 找 长度 。42.( 13 分 ) 设 将 n(n,1)个 整 数 存 放 到 一 维 数 组 R 中 , 试 设 计 一 个 在 时 间 和空 间 两 方 面 尽 可 能 有 效 的 算 法 , 将 R 中 保 有 的 序 列 循 环 左 移 P( 0Pn) 个 位 置 ,即 将 R 中 的 数 据 由 ( X0X1Xn-1) 变 换 为 ( XpXp+1Xn-1X0X1Xp-1)要 求 : ( 1) 给 出 算 法 的 基 本 设 计 思 想 。( 2) 根 据 设 计 思 想 , 采
11、用 C 或 C+或 JAVA 语 言 表 述 算 法 关 键 之 处 给 出 注释 。( 3) 说 明 你 所 设 计 算 法 的 时 间 复 杂 度 和 空 间 复 杂 度20111.设 n 是描述问题规模的非负整数,下面程序片段的时间复杂度是x = 2;while ( x S(1)-S(0) BS (0)-S(1)-main() Cma in()-S(0)-S(1) D S(1)-S(0)-main() 2先 序 序 列 为 a,b,c,d 的 不 同 二 叉 树 的 个 数 是 A1 3 B1 4 C1 5 D1 63 下 列 选 项 给 出 的 是 从 根 分 别 到 达 两 个 叶
12、节 点 路 径 上 的 权 值 序 列 , 能 属 于 同一 棵 哈 夫 曼 树 的 是 A24,10,5 和 24,10,7 B2 4,1 0,5 和 24,1 2,7 C2 4,1 0,1 0 和 24,14,1 1 D24,10,5 和 24,14,6 4现 在 有 一 颗 无 重 复 关 键 字 的 平 衡 二 叉 树(AV L 树),对 其 进 行 中 序 遍 历 可 得到 一 个 降 序 序 列 。 下 列 关 于 该 平 衡 二 叉 树 的 叙 述 中 , 正 确 的 是A 根 节 点 的 度 一 定 为 2 B 树 中 最 小 元 素 一 定 是 叶 节 点C 最 后 插 入
13、的 元 素 一 定 是 叶 节 点 D 树 中 最 大 元 素 一 定 是 无 左 子 树left weight right5设 有 向 图 G=(V,E),顶 点 集 V=V0,V1,V2,V3,边集E=,,,若 从 顶 点 V0 开 始 对 图 进 行 深 度 优 先 遍 历 , 则 可 能 得 到 的 不 同 遍 历 序列 个 数 是 A 2 B3 C4 D5 6 求 下 面 带 权 图 的 最 小 ( 代 价 )生 成 树 时 , 可 能 是 克 鲁 斯 卡 ( kruskal)算 法 第 二 次 选 中 但 不 是 普 里 姆 ( Prim)算 法 ( 从 V4 开 始 ) 第 2
14、次 选 中 的 边 是A( V1,V3) B( V1,V4) C (V2,V3) D( V3,V4) 7 下 列 选 项 中 , 不 能 构 成 折 半 查 找 中 关 键 字 比 较 序 列 的 是 A500,200,4 50,1 80 B5 00,450,200,1 80 C1 80,500,200,4 50 D180,2 00,5 00, 450 8 已 知 字 符 串 S 为“ abaabaabacacaabaabcc”. 模 式 串 t 为“ abaabc”, 采用 KMP 算 法进 行 匹 配 , 第 一 次 出 现 “失配” (si != ti) 时,i =j=5,则 下 次 开
15、 始 匹 配 时 , i 和 j 的 值 分别 是 Ai =1,j =0 Bi =5,j =0 Ci =5,j =2 Di =6,j =2 9 下 列 排 序 算 法 中 元 素 的 移 动 次 数 和 关 键 字 的 初 始 排 列 次 序 无 关 的 是 A 直 接 插 入 排 序 B 起 泡 排 序 C 基 数 排 序 D 快 速 排 序10 已 知 小 根 堆 为 8,15,10,21,34,16,12, 删 除 关 键 字 8 之 后 需 重 建 堆 ,在 此 过 程 中 , 关 键 字 之 间 的 比 较 数 是 A1 B2 C3 D4 11 希 尔 排 序 的 组 内 排 序 采
16、 用 的 是 ( ) A 直 接 插 入 排 序 B 折 半 插 入 排 序 C 快 速 排 序 D 归 并 排 序41. 用 单 链 表 保 存 m 个 整 数 , 节 点 的 结 构 为 (data,link),且 |data|=2)个 顶 点 的 邻接 矩 阵 为 B 则, Bm(2link; /*p 和 q 指向链表表头结点的下一个结点*/while(p!=NULL)if(countlink;/*q 移到下一个结点*/p=p-link; /*p 移到下一个结点*/if(countdata); /*查找成功*/return (1);/else/SearchN 2010 1-5:DCDCB
17、 6-11:ACBBDA41.(1)构造的散列表如下下标 0 1 2 3 4 5 6 7 8 9关键字 7 14 8 11 30 18 9(2)查找成功的平均查找长度:ASL 成功=12/7。查找不成功的平均查找长度:ASL 不成功=18/7。42.(1)给出算法的基本设计思想:先将 n 个数据 x0x1xpxn-1 原地逆置,得到 xn-1xpxp-1x0,然后再将前 n-p 个和后 p 个元素分别原地逆置,得到最终结果:xpxp+1 xn-1x0x1xp-1。(2)算法实现:void reverse(int r,int left,int right)int k=left,j=right,t
18、emp; /k 等于左边界 left,j 等于右边界 rightwhile(k0s1=0;e1=n-1;s2=1;e2=n-1;while(s1!=e1|s2!=e2)mid1=(s1+e1)/2;mid2=(s2+e2)/2;if(Amid1=Bmid2) return Amid1;if(Amid1len2) longList=L1-next; shortlist=L2-next; L=len1-len2;/表长之差/ifelse longList=L2-next; shortlist=L1-next; L=len2-len1;/表长之差 /else While(L-) longList=l
19、ongList-next; while(longList!=NULL) if(longList=shortList)/同步寻找共同结点 return longList; else longList=longList-next; shortlist=shortlist-next; /else/while return NULL; /Search_First_Common (3) 算 法 的 时 间 复 杂 度 为 O(len1+len2), 空 间 复 杂 度 为 O(1)。2013 1-5:DCDBA 6-10:CCDCA41.(1) 给 出 算 法 的 基 本 设 计 思 想 : (4 分)
20、算 法 的 策 略 是 从 前 向 后 扫 描 数 组 元素 , 标 记 出 一 个 可 能 成 为 主 元 素 的 元 素 Num。然 后 重 新 计 数 , 确 认 Num 是 否 是 主 元 素 。算 法 可 分 为 以 下 两 步 : 选 取 候 选 的 主 元 素 : 依 次 扫 描 所 给 数 组 中 的 每 个 整 数 , 将 第 一个 遇 到 的 整 数 Num 保 存 到 c 中记录 Num 的 出 现 次 数 为 1; 若 遇 到 的 下 一 个 整 数 仍 等 于Num则计数加一,否则计数减一; 当 计 数 减 到 0 时 , 将 遇 到 的 下 一 个 整 数 保 存
21、到 c 中 ,计 数 重 新 记 为 1, 开 始 新 一 轮 计 数 , 即 从 当 前 位 置 开 始 重 复 上 述 过 程 , 直 到 扫 描 完 全 部数 组 元 素 。 判断 c 中 元 素 是 否 是 真 正 的 主 元 素 : 再 次 扫 描 该 数 组 , 统 计 c 中 元 素 出现 的 次 数 , 若 大 于 n/2, 则 为 主 元 素 ; 否 则 , 序 列 中 不 存 在 主 元 素 。(2) 算 法 实 现 : (7 分 ) int Majority ( int A , int n ) int i, c, count=1; / / c 用 来 保 存 候 选 主
22、元 素 , count 用 来 计 数 c = A0; / / 设置 A0为 候 选 主 元 素 for ( i=1; i 0) count-;/ / 处 理 不 是 候 选 主 元 素 的 情 况else / / 更 换 候 选 主 元 素 , 重 新 计 数c = Ai;count = 1;/else/for if ( count0 ) for ( i=count=0; i n/2 ) return c; / / 确 认 候 选 主 元 素 else return -1; / / 不 存 在 主 元 素/Majority42.(1) 采 用 顺 序 存 储 结 构 , 数 据 元 素 按
23、其 查 找 概 率 降 序 排 列 。(2 分 ) 采 用 顺序 查 找 方 法 。 (1 分 ) 查 找 成 功 时 的 平 均 查 找 长 度= 0.351+0.352+0.153+0.154=2.1。(2 分) (2) 【 答 案 一 】 采 用 链 式 存 储 结 构 , 数 据 元 素 按 其 查 找 概 率 降 序 排 列 ,构 成 单 链表 。 (2 分)采 用 顺 序 查 找 方 法 。 (1 分 ) 查 找 成 功 时 的 平 均 查 找 长 度=0.351+0.352+0.153+0.154=2.1。(2 分 ) 【 答 案 二 】 采 用 二 叉 链 表 存 储 结 构
24、, 构 造 二 叉 排 序 树 , 元素 存 储 方 式 见 下 图 。(2 分)2014 1-5:CBADC 6-11:DDDDBC41 解 答 : 考 查 二 叉 树 的 带 权 路 径 长 度 , 二叉树的带权路径长度为每个叶子结点的深度与权值 之 积 的总和,可以使用先序遍历或层次遍历解决问题。1)算法的基本设计思想:基于先序递归遍历的算法思想是用一个 static 变 量 记 录 wpl,把每个结点的深度作为递归函数的一个参数传递,算法步骤如下:若该结点是叶子结点,那么变量 wpl 加 上 该 结 点 的 深 度 与 权 值 之 积 ; 若 该 结 点 非 叶 子 结 点 , 那么若
25、左子树不为空,对左子树调用递归算法,若 右 子 树 不 为 空 , 对右子树调用递归算法,深度参数均为本结点的深度参数加一;最 后 返 回 计 算 出 的 wpl 即 可 。基于层次遍历的算法思想是使用队列进行层次遍历,并记录当前的层数,当遍历到叶子结点时,累计 wpl;当遍历到非叶子结点时对该结点的把该结点的子树加入队列;当某结点为该层的最后一个结点时,层数自增 1;队 列 空 时遍 历 结 束 , 返 回 wpl2)二 叉 树 结 点 的 数 据 类 型 定 义 如 下 :typedef struct BiTNodeint weight;struct BiTNode *lchild,*rc
26、hild;BiTNode,*BiTree;3)算 法 代 码 如 下 :基于先序遍历的算法:intWPL(BiTreeroot)return wpl_PreOrder(root,0);/intintwpl_PreOrder(BiTreeroot,intdeep)static int wpl=0;/定义一个 static 变量存储 wplif(root-lchild=NULLif(root-lchild!=NULL)/若左子树不空,对左子树递归遍历wpl_PreOrder(root-lchild,deep+1);if(root-rchild!=NULL)/若右子树不空,对右子树递归遍历wpl_P
27、reOrder(root-rchild,deep+1);return wpl;/wpl_PreOrder基于层次遍历的算法:#defineMaxSize100 /设置队列的最大容量int wpl_LevelOrder(BiTree root)BiTree qMaxSize; /声明队列,e nd1 为头指针,e nd2 为尾指针int end1, end2; /队列最多容纳 MaxSize-1 个 元 素end1=end2=0; /头指针指向队头元素,尾指针指向队尾的后一个元素int wpl=0, deep=0; /初始化 wpl 和深度BiTree lastNode; /lastNode 用
28、来记录当前层的最后一个结点BiTree newlastNode; /newlastNode 用来记录下一层的最后一个结点lastNode=root; /lastNode 初始化为根节点newlastNode=NULL; /newlastNode 初始化为空qend2+=root; /根节点入队while(end1!=end2) /层次遍历,若队列不空则循环BiTree t=qend1+; /拿出队列中的头一个元素if(t-lchild=NULL /若为叶子结点,统计 wplif(t-lchild!=NULL) /若非叶子结点把左结点入队qend2+=t-lchild;newlastNode=t
29、-lchild; /并设下一层的最后一个结点为该结点的左结点if(t-rchild!=NULL) /处理叶节点qend2+=t-rchild;newlastNode=t-rchild;/ifif(t=lastNode)/若该结点为本层最后一个结点,更新 lastNodelastNode=newlastNode;deep+=1; /层数加 1/if/whilereturn wpl; /返回 wpl/wpl_LevelOrder注 意 : 上述两个算法一个为递归的先序遍历,一个为非递归的层次遍历,读 者 应 当 选 取 自 己 最 擅 长 的 书 写 方 式 。 直 观 看 去 , 先 序 遍 历
30、 代 码 行 数 少 , 不 用 运 用其 他 工 具 , 书 写 也 更 容易,希望读者能掌握。在先序遍历的算法中,s tatic 是一个静态变量,只在首次调用函数时声明 wpl 并 赋 值 为 0, 以 后 的 递 归 调 用 并 不 会 使得 wpl 为0,具体用法请参考相关资料中的 static 关 键 字 说 明 , 也可以在函数之外预先设置一个全局变量,并 初 始 化 。 不过考虑到历年真题算法答案通常都直接仅仅由一个函数构成,所 以 参 考 答 案 使 用 static。若 对 static 不熟悉的同学可以使用以下形 式 的 递 归 :int wpl_PreOrder(BiTr
31、ee root,intdeep)int lwpl, rwpl; /用于存储左子树和右子树的产生的 wpllwpl=rwpl=0;if(root-lchild=NULLif(root-lchild!=NULL) /若左子树不空,对左子树递归遍历lwpl=wpl_PreOrder(root-lchild,deep+1);if(root-rchild!=NULL) /若右子树不空,对右子树递归遍历rwpl=wpl_PreOrder(root-rchild,deep+1);return lwpl+rwpl;/wpl_PreOrderC/C+语言基础好的同学可以使用更简便的以下形式:int wpl_Pr
32、eOrder(BiTree root,int deep)if(root-lchild=NULLreturn(root-lchild!=NULL?wpl_PreOrder(root-lchild,deep+1):0)+(root-rchild!=NULL?wpl_PreOrder(root-rchild,deep+1):0);/wpl_PreOrder这个形式只是上面方法的简化而已,本 质 是 一 样 的 , 而这个形式代码更短,在时 间 有 限 的 情 况 下 更 具 优 势 , 能 比 写 层 次 遍 历 的 考 生 节 约 很 多 时 间 ,所 以 读 者 应 当 在 保 证 代 码 正
33、确 的 情 况 下 , 尽 量 写 一 些 较 短 的 算 法 ,为 其 他 题 目 赢 得 更 多 的 时 间 。 但 是 , 对 于 基 础 不 扎 实 的 考 生 , 还 是 建 议 使 用写 对 把 握 更 大 的 方 法 , 否 则 可 能 会 得 不 偿 失 。 例 如 在 上 面 的 代 码 中 , 考 生 容易 忘 记 三 元 式 (x?y:z)两 端 的 括 号 , 若 不 加 括 号 , 则 答 案 就 会 是 错 误 的 。2015 1-5:DCCBD 6-11:AACBBA41.(1) 算 法 思 想 : 定 义 一 个 大 小 为 N 的 数 组 , 初 始 化 为
34、0.在 遍 历 链 表 的 同 时 将 数组 中 索 引 值 为 节 点 的 值 的 绝 对 值 的 元 素 置 1.如 果 此 元 素 已 经 为 1,说 明 此 节 点 之 前 已 经有 与 此 节 点 的 值 的 绝 对 值 相 等 的 节 点 , 需 将 此 节 点 删 除 。(2) 节 点 的 数 据 结 构 定 义 如 下 : typedef struct Node Int data; Struct Node * next; Node; (3) int an; / 全 局 数 组 标 志 节 点 的 绝 对 值 的 值 是 否 出 现 过 void DeleteABSEqualNo
35、de(Node * head) memset(a,0,n); / 初 始 化 为 0 if (head = NULL) return NULL; Node * p = head; Node * r = headwhile (p != NULL) if (aabs(p-data) = 1)/如 果 此 绝 对 值 已 经 在 节 点 值 的 绝 对 值 中 出 现 过则 删 除 当 前 节 点 r-next = p-next; delete p; p = r-next; /ifelse /否 则 , 将 数 组 中 对 应 的 元 素 置 1, 并 将 指 针 指 向 下 一 个 元素aabs(
36、p-data) = 1; r = p; p = p-next; /else /while return head; /DeleteABSEqualNode(4) 只 遍 历 一 次 链 表 , 所 以 时 间 复 杂 度 为 O(n), 因 为 申 请 大 小 为 n 的 数 组 , 所 以空 间 复 杂 度 为 O(n),(n 为 节 点 绝 对 值 的 最 大 值 ) 。42.(1)邻 接 矩 阵 为 :( 2) 0 行 3 列 的 元 素 的 含 义 是 顶 点 0 到 顶 点 3 的 最 短 距 离 为 2.( 3) Bm 中 非 零 元 素 的 含 义 是 : 假 设 此 顶 点 位 于 i 行 j 列 , 如 果 i=j, 则 表 示 i 顶点 到 自 己 的 距 离 为 0; 如 果 ij, 则 表 示 顶 点 i 到 达 不 了 顶 点 j。