软考-软件设计师中级备考 13、刷题 数据结构
倒计时17天时间不多了,数据库、UML、等知识点有基础直接略过,法律全靠考前的一两天刷题,英语直接放弃。
一、数据结构:链表、栈、队列、数组、哈希表、树、图
1、关于链表操作,说法正确的是:
A)新增一个头结点需要遍历链表 B) 新增一个尾节点需要遍历链表
C)删除最后一个节点需要遍历链表 D)删除第一个节点需要遍历链表
答案是C,答题关键:1)理解链表的定义,2)说法正确/错误的是
去年真题,题目有争议,但是排除法可破。题目应为对于拥有头指针与尾指针的链表,删除最后一个节点需要查找倒数第二个节点,考察点:链表的查找需要遍历。
2.1、设栈初始时为空,对于入栈序列1,2,3,......,n这些元素经过栈之后得到栈序列P1,P2,P3,......,Pn
若P3=4,则p1,p2不可能的取值是(C)
A)6,5 B) 2,3 C)3,1 D)3,5
栈 先入后出
排除法 A=》6,5,4=》成立
B=》2,3,4=》1,2入栈后2出栈,3入栈后3出栈,4入栈后4出栈=》成立
C=》3,1,4=》???
D=》3,5,4=》1,2,3入栈后3出栈,4,5入栈后5出栈4出栈
2.2、2023真题:利用栈对算数表达式10*(40-30/5)+20求值时,存放操作数的栈(初始为空)的容量至少为(4)才能满足暂存该表达式中的运算数或运算结果的要求?
先计算括号内的除法
- 开始扫描表达式,首先遇到操作数
10
,将10
入栈,此时操作数栈:[10]
。 - 遇到左括号
(
,继续扫描,遇到操作数40
,将40
入栈,此时操作数栈:[10, 40]
。 - 遇到操作数
30
,将30
入栈,此时操作数栈:[10, 40, 30]
。 - 遇到操作数
5
,将5
入栈,此时操作数栈:[10, 40, 30, 5]
。 // 此时栈中元素数量达到最多 - 遇到除号
/
,从操作数栈中弹出两个操作数5
和30
(先弹出5
,再弹出30
),计算30÷5 = 6
,将结果6
入栈,此时操作数栈:[10, 40, 6]
。 - 遇到减号
-
,从操作数栈中弹出两个操作数6
和40
(先弹出6
,再弹出40
),计算40 - 6 = 34
,将结果34
入栈,此时操作数栈:[10, 34]
。 - 遇到右括号
)
,遇到乘号×
,从操作数栈中弹出两个操作数34
和10
(先弹出34
,再弹出10
),计算10×34 = 340
,将结果340
入栈,此时操作数栈:[340]
。 - 遇到操作数
20
,将20
入栈,此时操作数栈:[340, 20]
。 - 遇到加号
+
,从操作数栈中弹出两个操作数20
和340
(先弹出20
,再弹出340
),计算340 + 20 = 360
,将结果360
入栈,此时操作数栈:[360]
。
3、某队列允许在其两端进行入队操作,但仅允许在一端进行出队操作。若元素a、b、c、d依次全部入队列,之后进行出队操作,则不能得到的出队序列是:
A)dbac B)cabd C)acdb D)bacd
对于普通队列,由打饭排队先到先得可破(先入先出FIFO),所以会考察变种题比如两端入队、一端出队问题。
答案是C,因为是依次入队列,出队时a和b肯定是挨着的,可以将a和b看成是一个整体,用排除法解题。设ab=m、ba=n
A)dnc B)cmd C)acdb D)ncd =》选C
链表和数组都可以实现队列,当使用数组+首尾指针实现队列时,不需要(无法)移动队内元素,由于数组大小是固定的所以存在溢出的问题,由于顺序存储所以存在假溢出问题,针对假溢出=》循环队列
4、(对比链表)采用数组实现队列的优点是入队和出队操作不需要移动队内元素
数组+首尾指针
循环队列是数组实现队列的改进算法,通过取模运算,避免假溢出
数组+首尾指针+取模运算 rear = (rear + 1) % maxSize、 front = (front + 1) % maxSize
4.1 单纯的数组题,考察按行优先/按列优先,寻址
以上图3x3的二维数组为例 按行:a00,a01,a02,a10,a11,a12,a20,a21,a22
按列:a00,a10,a20,a01,a11,a22,a02,a12,a22
1)已知二维数组A按行优先方式存储,每个元素占用2个存储单元,第一个元素A[0][0]的地址为100,元素A[3][3]的存储地址是220,则元素A[5][5]的地址是(300)
2)已知二维数组A按列优先方式存储,每个元素占用2个存储单元,第一个元素A[0][0]的地址为100,元素A[3][3]的存储地址是220,则元素A[5][5]的地址是(300)
5.1、某树共有n个节点,其中所有分支节点的度为K,则该树中叶子节点的个数为:
A、 (n(k+1)-1)/k B、 (n(k+1)+1)/k C、 (n(k-1)+1)/k D、 (n(k-1)-1)/k
答案是C,死记硬背 ,如果记不住,那假设树有2个节点,=》所有分支节点的度为1,带入公式。
5.2、已知树T的度为4,且度为4的结点数为7个、且度为3的结点数为5个、且度为2的结点数为8个、且度为1的结点数为10个,那么T的叶子节点个数为(40)
总结点数:4*7+3*5+2*8+1*10+1=70 非叶子节点个数:7+5+8+10=30 =》70-30=40
6、当一颗非空二叉树的()时,对该二叉树进行中序遍历和后续遍历所得的序列相同
A)每个非叶子节点都只有左子树 B)每个非叶子节点都只有右子树
C)每个非叶子节点的度都为1 D)每个非叶子节点的度都为2
答案是A 左->根
二叉树是一种每个节点最多有两个子树的树结构,这两个子树分别称为左子树和右子树。
前序遍历:根->左->右 中序遍历:左->根->右 后序遍历:左->右->根
口诀是简化过得,实际运用为算法:
前序遍历:根->左子树(递归)->右
中序遍历:左子树(递归)->根->右子树(递归)
后序遍历:左子树(递归)->右子树(递归) ->根
再次强化:
7、已知某二叉树的先序遍历序列为A B C D E F、中序遍历序列为B A D C F E,则可以确定该二叉树()
A)是单支树(即非叶子结点都只有一个孩子) B)高度为4
C)根节点的左子树为空 D)根节点的右子树为空
答案是B,排除法,根节点的左子树为空不符合中序遍历C不对,根节点的右子树为空不符合中序遍历D不对=》A也不对,单支树属于二叉树,遇到二叉树公式题,巧用单支树举例
19年真题:某二叉树的中序,先序遍历序列分别为{20,30,10,50,40},{10,20,30,40,50},则该二叉树的后序遍历序列为() {30,20,50,40,10}
先序,中序遍历序列 {10,20,30,40,50},{20,30,10,50,40}
=》10是根节点所以肯定在最后一个 排除法,20、30属于左子树 排除法、50,40属于右子树 排除法
8、当二叉树中的节点数目确定时,(B)的高度一定是最小的。
A) 二叉排序树 B)完全二叉树 C)线索二叉树 D)最优二叉树
深度为3的完全二叉树如下图,具有n个节点的完全二叉树的深度为⌊log2n⌋+1 ,⌊⌋表示向下取整,带入6和7,得到的结果都是三。
(满二叉树)
2021年真题 若某二叉树中共有1024个节点,则该二叉树的高度区间是()
最高是1024即单支树,最低是完全二叉树⌊log2n⌋+1=》11 =》[11,1024]
9、最优二叉树(哈夫曼树)
以下关于哈夫曼树的叙述中错误的是(D)
A 权值越大的叶子离根结点越近 B 哈夫曼树中不存在只有一个子树的结点
C 哈夫曼树中的结点总数一定为奇数 D 权值相同的结点到树根的路径长度一定相同
带权二叉树是一种 每个节点(通常指叶子节点)都带有权值 的二叉树。权值可以是任意给定的数值,而带权路径长度(WPL)是指从根节点到每个叶子节点的路径长度(边数)乘以该叶子节点权值的总和
哈夫曼树是一种 特殊的带权二叉树,它满足 带权路径长度(WPL)最小 的条件,因此也被称为 “最优二叉树”。其构造方法是通过哈夫曼算法,每次选择权值最小的两个节点合并,直到形成一棵完整的二叉树。
假设有三个叶子节点,权值分别为 1、2、3,构件哈夫曼树,画图表示,并计算权值
- 权值为1的叶子节点的带权路径长度为2*1 = 2(从根节点到该叶子节点经过2条边);
- 权值为2的叶子节点的带权路径长度为2*2 = 4;
- 权值为3的叶子节点的带权路径长度为2*3 = 6。
- 2+4+6=12;
2023年真题 一颗哈夫曼树共有127个结点,对其进行哈夫曼编码,功能得到(64)个字符编码
二叉树中结点总数n与度为0、度为1、度为2的结点数之间的关系为n = n0 + n1 + n2。
对于哈夫曼树n1 = 0,n0=n2+1 =》 n2 = 64
10、设有5个字符,根据其使用频率为其构造哈夫曼编码。以下编码方案中()是不可能的。
A) {111,110,101,100,0} B{0000,0001,001,01,1}
C){11,10,01,001,000} D{11,10,011,010,000}
哈夫曼编码是一种前缀编码,即对于一组编码,任何一个编码都不是其他编码的前缀。
本题通过前缀无法判断
根据哈夫曼编码的构造规则和前缀码的Kraft不等式分析:
选项D的编码{11,10,011,010,000}
长度分布:2个长度为2的编码,3个长度为3的编码。
Kraft总和=1:计算为 2*2^-2+3*2^-3=7/8<1=》D
11、某简单无向连通图G的顶点数为n,则图G最少和最多分别有()条边。
n-1,n*(n-1)/2 加上顶点数为1=》只有0条边,排除法
12、设有向图G具有n个顶点、e条弧,采用邻接表存储,则完成深度/广度优先遍历的时间复杂度为 O(n + e)
13、对于如下所示的有向图,其邻接矩阵是一个(5*5)矩阵,采用邻接链表存储时顶点的表结点个数为2,顶点5的表结点个数为0,顶点2和3的表结点个数分别为(2.2)
空1)行列数都为节点个数
空2)看箭头指向别人几条