如题30图所示的图结构,请写出以10为源点的广度优先搜索得到的顶点访问序列,并画出搜索过程图。(同等情况下,值小的结点优先访问)
设散列表的长度为11,散列丽数h(key)=key mod 11,采用线性探查法解决冲突。从空表开始,依次插人下列关键字值序列:80,40,7,18,13,2,请建立散列表。
依次输人键值序列:30,10, 20,50,40,60,构建二叉排序树,要求给出构建过程。
https://www.bilibili.com/video/BV1Tk4y117fs?from=search&;seid=15419245847752740376&spm_id_from=333.337.0.0
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
int SearchBin(SqTable T, KeyType key) {
/**
* 在有序表T中,用二分查找键值等于key的元素
* 变量low、high分别标记查找区的下界和上界
*/
int low, high;
low = 1;
high = T.n;
// low和high的区间长度不为0时继续查找
while (low <= high) {
// low+high本应该还要进行一个向下取整的,但是自考办给的答案忽略了那我们也忽略floor。
mid = (low + high) / 2; // 对区间进行折半
if (key == T.elem[mid].key) {
return mid;
} else if (key < T.elem[mid].key) {
high = mid - 1; // 在前半区间查找
} else {
low = mid + 1; // 在后半区查找
}
}
return 0;
}
void SelectSort(List R,int n) {
int min, i, j;
// 每次循环,选出一个最小值
for (i = 1; i <= n-1; i++) {
min = i; // 假设第i个记录值最小
for (j = i+1; j <= n; j++) {
if (R[j].key < R[min].key) {
min = j; // 记录下键值较小记录的下标
}
if (min != i) {
swap(R[min], R[i]); // 将最小键值记录和交换第i个记录交换
}
}
}
}
1.题29图给出了一个稀疏矩阵A,请写出该稀疏矩阵的三元组表。
答:
((0,1,5),(2,1,-1),(2,3,7),(3,1,6),(4,4,9),(5,5,8))
2.已知二叉树如题30图所示,请将该二叉树转换为对应的森林。
答:
3.设某通信系统中一个待传输的文本有6个不同字符,它们的出现频率分别是0.5、0.7、1.4、2.2、2.4、2.8。试画出哈夫曼树,并给出每个字符的哈夫曼编码。(要求任一结点的左孩子权值小于右孩子)
答:
出现频率为0.5的字符编码为1000
出现频率为0.7的字符编码为1001
出现频率为1.4的字符编码为101
出现频率为2.2的字符编码为00
出现频率为2.4的字符编码为01
出现频率为2.8的字符编码为11
4.选定散列函数为H(key) = key mod 13,实用链地址法建立值为 26,41,25,05,07,15,12,49,51,31,62 的散列表。
答:
5.对于给定的一组键值:83,40,63,13,84,35,96,57,39,79,61,15,请分别写出直接选择排序和冒泡排序的第一趟排序结果。
答:
直接选择排序:13,40,63,83,84,35,96,57,39,79,61,15
冒泡排序:40,63,13,83,35,84,57,39,79,61,15,96
1.写出一个将线性表的顺序表存储方式(数组a,表长为n)改成单链表存储方式(其头结点由头指针head指向)的算法。设函数头为:Node * CreateLinkedList(DataType a[], int n)
答:
Node * CreateLinkedList(DataType a[], int n) {
head = (Node *)malloc(sizeof(Node)); // (1分)
head -> next = NULL; // (1分)
for (i = n; i > 0; i--) { // (1分)
p = (Node *)malloc(sizeof(Node));
p -> data = a[i - 1];
p -> next = head -> next;
head -> next = p; // 整个for循环内容(3分)
}
return head; // (1分)
}
2.以二叉链表作存储结构,请写出二叉链表类型定义;利用二叉树遍历的递归算法,试编写求二叉树高度的算法。
答:
// 二叉链表类型定义如下:
typedef struct btnode {
DataType data;
struct btnode *lchild, *rchild;
} * BinTree; // (2分)
// 求二叉树的高度的算法如下:
int Height(BinTree bt) {
int lh, rh; // (1分)
if (bt == NULL) return 0; // (1分)
lh = Height(bt -> lchild); // (1分)
rh = Height(bt -> rchild); // (1分)
return 1 + (lh > rh ? lh : rh); // (1分)
}
1.设一个链栈的输入序列为A、B、C,请问共有几种可能的输出序列?试写出所得到的所有可能的输出序列。
答:
共有5种可能的输出序列 (1分)
它们分别是:ABC、BCA、BAC、CBA、ACB【每答出一个1分】
2.假设一棵二叉树的中序序列与后序序列分别为:B A C D E F G H 和 B C A E D G H F,请画出该二叉树。
3.用Kruskal方法求题31图所示的图的最小生成树。(要求给出求解过程)
答:
4.根据二叉排序树的插入算法,从空树开始建立键值序列{ 50,48,24,55,53,90 }的二叉排序树,要求给出建立过程
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
5.对于给定的一组键值:25,11,22,34,5,44,76,61,100,3,14,120,请分别写出直接插入排序和冒泡排序的第一趟排序结果。
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
直接插入排序:11,25,22,34,5,44,76,61,100,3,14,120
冒泡排序:11,22,25,5,34,44,61,76,3,14,100,120
1.在单链表存储结构中,线性表的表长等于单链表中数据元素的结点个数,即除了头结点以外的结点的个数。通常通过头指针head来访问一个单链表。已知单链表结构如下:
typedef struct node {
DataType data;
struct node * next;
} Node, * LinkList;
设计求表长的算法,要求算法返回表长。
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
int count(LinkList head) {
LinkList p = head -> next;
int n = 0;
while (p != NULL) {
m++;
p = p -> next;
}
return n;
}
2.以二叉链表作存储结构,请设计算法求二叉树的结点的个数。
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
// 二叉链表的结构类型定义
typedef struct btnode {
DataType data;
struct btnode *lchild, *rchild; // 指向左右孩子的指针
} *BinTree;
// 获取二叉树结点个数的算法
1.设有编号为1,2,3,4的四辆列车,顺序进入一个栈式结构的站台,若列车2最先开出,则列车出站可能的顺序有几种?并写出这四辆列车所有可能的出站顺序。
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
若列车2最先开出站,则列车出站可能的顺序有五种。
分别是:
2134
2143
2314
2341
2431
4.已知题32图所示的二叉排序树中各结点的值分别为1~9,请写出图中结点A~I所对应的值
答:
A:5
B:1
C:9
D:4
E:6
F:2
G:7
H:3
I:8
5.已知键值序列 { 11,2,13,26,5,18,4,9 },设散列表表长为13,散列函数H(key) = key mod 13,处理冲突的方法为线性探测法,请给出散列表。
1.读入 n = 100个整数到一个数组中,写出实现将该组数进行逆置的算法,并分析算法的空间复杂度。
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
void reverseArr(int a[], int n) {
int i, temp;
for (i = 0; i <= n / 2 - 1; i++) {
temp = a[i];
a[i] = a[n - 1 - i];
a[n - 1 - i] = temp;
}
}
reverseArr算法所需要的辅助变量为2个整型变量 i 和 temp,与问题的规模无关,其空间复杂度为 O(1)。
2.试写出二分查找的递归算法。
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
int binsearch_2(Sqtable R, KeyType k, int low, int high) {
int mid = (low + high) / 2;
if (R.elem[mid].key == k) {
return mid;
} else if (R.elem[mid].key > k) {
return binsearch_2(R, k, low, mid - 1);
} else {
return binsearch_2(R, k, mid + 1, high);
}
}
1.二叉树的五种基本形态如题29图所示。
问1:子树用什么形状表示?
问2:分别写出题29-1图、题29-2图和题29-5图的形态
答:
2.给定无向图如题30图所示。
问1:计算D(v1)和D(v2)
问2:写出以顶点v0为起点到v3的所有简单路径。
答:
3.给定一组键值 { 45,38,66,90,88,10,25,45 } ,假设在排序过程中,前4个记录已按键值递增顺序重新排列,构成了一个有序序列为 { 38, 45, 66, 90 }。
问1:请写出应用直接插入排序方法对剩余键值排序的排序过程。
问2:直接插入排序方法是否稳定?
答:
4.设有m个顶点的无向图G,采用邻接矩阵作存储结构,在邻接矩阵上判断下列有关问题,给出简单的算法描述。
问1:图中有多少条边?
问2:任意俩个顶点i和j是否有边相连?
问3:任意一个顶点的度是多少?
答:
5.已知散列函数为H(key) = key mod 7,构造散列表如题33表,并用线性探测法解决冲突。若要用该散列表查找元素 25,32,68,请分别给出所需的比较次数。
答:
1.写出实现对一个n * n阶矩阵进行转置的算法。
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
void MM(int A[n][n]) {
int i, j, temp;
for (i = 0; i < n; i++) {
for (j = 0; j < i; j++) {
temp = A[i][j];
A[i][j] = A[j][i];
A[j][i] = temp;
}
}
}
2.已知二叉链表的类型定义如下:
typedef struct btnode {
DataType data;
struct btnode *lchild, *rchild;
} * BinTree;
假设visit(bt)是一个已定义的过程,其功能是访问指针bt所指结点。设计在二叉链表上的先序遍历算法和中序遍历算法。
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
//先序遍历【根左右】
void preOrder(BinTree bt) {
if (bt !== NULL) {
visit(bt);
preorder(bt -> lchild);
preorder(bt -> rchild);
}
}
//中序遍历【左根右】
void midOrder(BinTree bt) {
if (bt !== NULL) {
preorder(bt -> lchild);
visit(bt);
preorder(bt -> rchild);
}
}
1.题29-1图和题29-2图为俩种形态的二叉树。
问1:题29-1图、题29-2图各属于何种类型的二叉树?
问2:二叉树通常有哪俩类存储结构?
答:
2.无向图如题30图所示。
问1:列出所有简单回路。
问2:写出邻接矩阵。
答:
3.设待排序的键值为 45,38,66,90,88,10,25,45。利用冒泡排序算法进行排序,已知第一趟排序后的键值为:38,45,66,88,10,25,45,90,请写出后续每趟排序的结果。
答:
4.设序列 { d c b a h e i f g } 和 { a b c h d i e f g } 分别是一棵二叉树的先序序列和中序序列,请画出该二叉树。
答:
5.给定表(Jan, Feb, Mar, Apr, May, Jul)。散列表的地址空间为 0 ~10,设散列函数H(x) == ⌊i / 2⌋,其中i为键值中第一个字母在英语字母表中的序号,要求画出以线性探测法解决冲突的散列表。
博主额外补充:⌊⌋符号是向下取整的意思,丢弃结果的小数部分。
答:
1.设计算法在整型数组A[n]中查找值为k的元素,若找到,则输出其位置 i(0 <= i <= n - 1),否则输出 -1 作为标志。
答 (博主的答案,没找到自考办给的官方答案,如果有小伙伴找到了辛苦下方评论留下地址) :
int search(int A[], int n, int k) {
int i = 0;
int resIndex = -1; // 最终找到的下标位置
while(i <= n - 1) {
if (A[i] != k) {
i++;
} else {
resIndex = i;
break; // 找到了,退出循环
}
}
return resIndex;
}
2.设计算法按先序次序打印二叉树T中叶子结点的值。
答: