考研计算机874数据结构知识整理 Apare_xzc

考研计算机874数据结构知识整理Apare_xzc

for zcy勇哥

2020.11.17


一、题目类型

10道填空题
4道综合题
2道算法题(出自历年期末考试,主要考链表和二叉树)

二、综合题的考点

  1. 二叉树的遍历(给出先序中序还原二叉树,求后序)
  2. 线索二叉树(画出)
  3. 排序算法的比较(最好最坏时间空间复杂度,稳定性)
  4. 哈夫曼编码(给定字母出现概率,生成哈夫曼树,求每个字母的编码,以及带权路径总长度WPL)
  5. 最小生成树(Prim, Kruskal)
  6. 堆排序相关(初始建堆的结果,每一趟的结果)
  7. 哈希表(给出待散列的序列,除留取余法,链地址法处理冲突,求出每个元素的散列地址,求平均查找长度)
  8. 最短路径(Dijkstra)
  9. 折半查找(画出判定树,求平均查找长度(成功/失败),求查找某个值得过程)
  10. 图的综合题(给一个图,求邻接表,求深度优先遍历的结果,根据Prim构造最小生成树)
  11. 二叉排序树(给一个线性表序列,插入到空的二叉排序树中,求出其平均查找长度)

三、算法编程题

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值