1,首先先来看简答题。
线性表的顺序和链式存储方式:
优点:
顺序表:1,内存连续,可以快速访问任意位置元素。
2,存储密度高,不需要额外的存储空间。
链式表:1,便于插入和删除,插入和删除的时间复杂度都是O(1),只需要修改指针,不需要移动元素。
2,可以固定分配内存,灵活度高,不受容量控制。
缺点:
顺序表:1,插入和删除需要移动大量元素,操作时间复杂度是O(n)。
2,容量固定,需要预先分配一定大小的内存空间,不易动态扩展。
链式表:1,需要额外的指针空间来存储元素之间的联系,增加了存储开销。
2,访问元素需要从头遍历链表,时间复杂度是O(n)。
对于无向图,什么是顶点的度:
在无向图中,顶点的度就是与该顶点相连的边的数量。
请简要写出递归方法求取二叉树深度的过程:
1,首先定义递归函数depth(node),用于计算以node为根节点的二叉树的深度。
2,如果node==NULL,表示节点为空,即空数,函数返回0。
3,否则,递归计算左子树的深度,结果保存在left_depth中,调用递归函数depth(left_depth)
。递归计算右子树的深度,将结果保存在right_depth中,调用递归函数depth(right_depth)。
4,当前二叉树的深度等于其左右子树的最大深度+1,即max(left_depth,right_depth)+1,返回值作为当前二叉树的深度。
下面给出一段Python代码:
def depth(node):
if node is None:
return 0
else:
left_depth = depth(node.left)
right_depth = depth(node.right)
return max(left_depth, right_depth) + 1
当然,我WHU的学生习惯使用C++。下面给出C++代码:
int depth(TreeNode* node) {
if (node == nullptr) {
return 0;
} else {
int leftDepth = depth(node->left);
int rightDepth = depth(node->right);
return std::max(leftDepth, rightDepth) + 1;
}
}
什么是赫夫曼树:
赫夫曼树也叫做最优二叉树。其实也就是哈夫曼树,音译问题。由给定权重构建哈夫曼树的方法如下:
不断选取给定权重中最小的两个,其和组成新的权重,并将每次组合之后最小的两个权重不断向上连接成树。
简述有序表的折半查找过程:
-
首先,确定要查找的目标元素
target
和有序表的范围,通常是整个有序表。 -
初始化两个指针,
left
和right
,分别指向有序表的起始位置和结束位置。 -
在每一次迭代中,计算中间位置
mid
,即mid = (left + right) / 2
。 -
比较目标元素
target
和中间位置元素arr[mid]
的值:- 如果
target
等于arr[mid]
,则找到目标元素,返回mid
。 - 如果
target
小于arr[mid]
,说明目标元素可能在左半部分,更新right = mid - 1
。 - 如果
target
大于arr[mid]
,说明目标元素可能在右半部分,更新left = mid + 1
。
- 如果
-
重复步骤 3 和 4,直到找到目标元素或者
left > right
,表示整个有序表中没有目标元素。
常见的题目是:对于从一开始递增为1的有序排列数组,查找数m最多需要几次折半查找。
假设需要n次查找,则2**n>m,n取所有满足条件的n的最小值。
下面还有几个知识点出现在这张试卷上:
很显然,只有栈是线性数据结构。树属于树形结构,图和网都属于图形结构。
数据结构的类型有以下几种:
-
线性结构(Linear Data Structures):线性结构是最简单和常见的数据结构类型。它包括数组(Array)、链表(Linked List)、栈(Stack)、队列(Queue)等。线性结构的特点是数据元素之间存在一对一的关系,元素之间只有一个前驱和一个后继。
-
树形结构(Tree Data Structures):树形结构是非线性的数据结构,以分层的方式组织数据。常见的树形结构有二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)、平衡二叉树(Balanced Binary Tree/AVL Tree)、堆(Heap)等。树形结构的特点是一个节点可以有多个子节点。
-
图形结构(Graph Data Structures):图形结构是由节点和边组成的非线性数据结构。图可以是有向的(有向图)或无向的(无向图),可以带有权重或值(带权图)。图的常见表示方式有邻接矩阵(Adjacency Matrix)和邻接表(Adjacency List)等。
-
散列结构(Hashing Data Structures):散列结构使用散列函数将数据映射到一个固定的位置,称为散列桶或槽。常见的散列结构有哈希表(Hash Table)和哈希集合(Hash Set)。散列结构的特点是可以在常数时间内进行插入、删除和查找操作。
-
文件结构(File Data Structures):文件结构是在磁盘或其他外部存储介质上组织和管理数据的方法。常见的文件结构有顺序文件、索引文件、散列文件等。(很少用,基本不考。)
在第一个简答题中我们就已经叙述了顺序表内存连续,可以快速访问任意元素,所以访问的时间复杂度是O(1),但是插入和删除则需要移动大量的元素,时间复杂度是O(n)。请注意,时间复杂度括号里面不允许存在系数。所以O(n/2)一眼错。
结点个数最多就是全部占满呗,高度为8的满二叉树结点数是(2**8)-1=255。但是有时候这种题会考察高度为8的完全二叉树的节点个数最多多少个,最少多少个,完全二叉树的叶子结点只能存在在最低的两层。最多为(2**8)-1,仅当完全二叉树是满二叉树的情况下是。最少是2**(8-1)=128。当且仅当最后一层只有一个叶子结点的时候。
看这道题,你应该很快想起在xqm班上被打的那位同学。
很明显,广度优先搜索是层次搜索,使用队列,相邻结点进入队列,取出要用到的结点而后才会进入其子结点,但是下一次是在队头取结点,即还是刚使用结点的兄弟结点,很明显有层次遍历的作用。广度优先搜索也叫宽度优先搜索,可以得到最优解。而深度优先搜索是纵向搜索,使用堆栈比较合适,已经遍历过遍历一个结点后放入其子结点,子结点放在兄弟结点后面,使用堆栈从栈顶取结点,越后放入的结点越先被取到,即取过某个结点后就取其子结点,有效的实现了纵向搜索。
邻接矩阵问题,有n个顶点就要有n个行,表示与指定元素相连的元素,n个列,表示指定元素被某些元素相连,无向图的邻接矩阵具有对称性,A与B相连,则B与A相连,有向图则不具有这种对称性。注意分析。
该题考察快速排序,关于快速排序,见图:
下面我们确定时间复杂度:很明显基本操作是s=s+t,其运算次数的阶数最高,是O(n²)。
顺序表是顺序存储,内存连续,显然,第十一个元素的存储起始地址是1000+2(11-1)=1020。
基本概念,遍历的顺序包括先序遍历,中序遍历和后序遍历,分别对应根左右,左根右,左右根。
折半查找,也就是二分查找,为了方便利用数据索引,当然是使用顺序存储结构。实现快速定位。
1.队空条件:rear==front
2.队满条件:(rear+1) %QueueSIze==front,其中QueueSize为循环队列的最大长度,也就是n。
弧也就是边,也就是n个顶点的有向图最多有多少条边,显然,每个顶点最多与(n-1)个顶点相连,则最多有n(n-1)条边,如果是无向图就要折半了。
小题就这些,希望大家都考出好成绩。