考研计算机874数据结构知识整理Apare_xzc
for zcy勇哥
2020.11.17
一、题目类型
10道填空题
4道综合题
2道算法题(出自历年期末考试,主要考链表和二叉树)
二、综合题的考点
- 二叉树的遍历(给出先序中序还原二叉树,求后序)
- 线索二叉树(画出)
- 排序算法的比较(最好最坏时间空间复杂度,稳定性)
- 哈夫曼编码(给定字母出现概率,生成哈夫曼树,求每个字母的编码,以及带权路径总长度WPL)
- 最小生成树(Prim, Kruskal)
- 堆排序相关(初始建堆的结果,每一趟的结果)
- 哈希表(给出待散列的序列,除留取余法,链地址法处理冲突,求出每个元素的散列地址,求平均查找长度)
- 最短路径(Dijkstra)
- 折半查找(画出判定树,求平均查找长度(成功/失败),求查找某个值得过程)
- 图的综合题(给一个图,求邻接表,求深度优先遍历的结果,根据Prim构造最小生成树)
- 二叉排序树(给一个线性表序列,插入到空的二叉排序树中,求出其平均查找长度)
三、算法编程题
2020年:统计字符串中单词出现的个数(直接C++map,java Hashmap, 或者用有序链表维护)
2019年:求二叉树的宽度,删除有序链表在(mink,maxk)范围的结点
2018年:在用双向链表实现的有序表中检索具有关键字key的结点, 二叉排序树的查找、插入(非递归)
2017年:有序链表中插入元素,二叉排序树的查找、插入(非递归)
2016年:求链表中结点为值为偶数的结点之和,求二叉树叶子结点值之和
2015,2014年:求链表结点值能被5整除/能被2整除的个数(链表的遍历)
2013年:送分水题,输入一行字符,统计其中数字,字母,空格和其它字符的个数。
四、填空选择考点
广义表
二叉树的遍历
图的广度优先遍历
哈希表
归并排序的趟数
中缀,后缀表达式,表达式树
单链表的插入,删除,遍历
循环队列的实现,栈的实现(top,head,tail如何赋值)
拓扑排序
二分查找,插入二叉排序树,插入堆的复杂度O(log2n)
有向图、无向图的最大边数,顶点度数
顺序存储,链式存储
二叉树叶子结点的个数
可能的出栈顺序
初始堆
快排时间复杂度,第一次划分后的结果
算法题详解:
1. [2020年真题]统计字符串中单词出现的个数,按照字典序输出。
可以用有序链表维护。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct ListNode{
//链表结点的定义
int cnt; //这个单词出现的次数
char word[20]; //记录单词
struct ListNode * next;
}ListNode;
int main(void) {
char str[20];
ListNode * head = (ListNode*)malloc(sizeof(ListNode)); //头结点
head->next = NULL;
ListNode * p = head;
while(scanf("%s",str)!=EOF) {
p = head;
int flag = 0;
while(p->next) {
//从前往后遍历链表
if(strcmp(p->next->word,str)==0) {
p->next->cnt += 1;
flag = 1;
break;
}
else if(strcmp(p->next->word,str)>0) break;
else p = p->next;
}
if(!flag) {
p = head;
while(p->next&&strcmp(p->next->word,str)<0) //找到插入的位置
p = p->next;
ListNode * tmp = (ListNode*)malloc(sizeof(ListNode));
tmp->cnt = 1;
strcpy(tmp->word,str);
tmp->next = p->next;
p->next = tmp;
}
}
p = head;
while(p->next) {
printf("%s\t%d\n",p->next->word,p->next->cnt);
p = p->next;
}
return 0;
}
2. [2019年真题]求二叉树的宽度
维护一个CurCnt变量,记录上一层在队列中的结点数。当CurCnt为0时,说明此时队列中都是这一层的。于是用Q.size()更新答案
核心代码:
int GetWidthOfBinaryTree(TreeNode * root) {
if(!root) return 0;
std::queue<TreeNode*> Q;
Q.push(root);
int CurCnt = 1,MaxWidth=0;
while(!Q.empty()) {
TreeNode * tp = Q.front(); Q.pop();
if(tp->lson) Q.push(tp->lson);
if(tp->rson) Q.push(tp->rson);
if(--CurCnt==0) {
MaxWidth = max(MaxWidth,(int)Q.size());
CurCnt = Q.size();
}
}
return MaxWidth;
}
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#define maxn 100
#define max(a,b) (a>b?a:b)
using namespace std;
struct TreeNode{
char val;
struct TreeNode * lson;
struct TreeNode * rson;
};
char sequence[maxn] = "ABD#G##EH##I##C#FJ###";
TreeNode * buildTree(char * str,int& x) {
if(str[x]=='#') {
x++;
return NULL;
}
TreeNode * pNode = (TreeNode*)malloc