等级标准
- 掌握数据结构中的二叉树;
- 掌握数据结构中的堆;
- 掌握数据结构中的图 ;
- 掌握空间效率分析的基本方法;
- 能够使用上述方法编写指定功能的正确完整的程序。
二叉树的深度
考试试题
给定一棵二叉树,求该二叉树的深度
二叉树深度定义:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的节点个数为树的深度
时间限制:1000
内存限制:65535
输入
第一行是一个整数n,表示二叉树的结点个数。二叉树结点编号从1到n,根结点为1,n <= 10 接下来有n行,依次对应二叉树的n个节点。 每行有两个整数,分别表示该节点的左儿子和右儿子的节点编号。如果第一个(第二个)数为-1则表示没有左(右)儿子
输出
输出一个整型数,表示树的深度
样例输入
3
2 3
-1 -1
-1 -1
样例输出
2
参考答案
#include <bits/stdc++.h>
using namespace std;
struct TreeNode{
int node_id;
TreeNode* left;
TreeNode* right;
};
class Solution {
private:
TreeNode* treelist;
int max_depth = 0;
int traverse(TreeNode* root) {
if(root == NULL){
return 0;
}
int left = traverse(root->left);//左子节点最大深度
int right = traverse(root->right);//右子节点最大深度
int max_lr = max(left, right) + 1; //包含自身节点所以+1
max_depth = max(max_depth, max_lr);
return max_lr;
}
public:
void buildTree(){
int N;
scanf("%d", &N);
treelist = new TreeNode[N + 1];
memset(treelist, 0, sizeof(treelist));
for(int i = 1; i <= N; i++){
int node_left, node_right;
scanf("%d%d", &node_left, &node_right);
treelist[i].node_id = i;
treelist[i].left = NULL;
if(node_left > 0){
treelist[i].left = &treelist[node_left];
}
treelist[i].right = NULL;
if(node_right > 0){
treelist[i].right = &treelist[node_right];
}
//printf("%d,%d,%d\n", i, treelist[i].left, treelist[i].right);
}
}
int maxDepth() {
TreeNode* root = &treelist[1];
traverse(root);
return max_depth;
}
};
int main() {
#ifdef LOCAL
freopen("t1.in", "r", stdin);
#endif
Solution s;
s.buildTree();//创建二叉树
int max_depth = s.maxDepth();//递归遍历获取二叉树最大深度
printf("%d", max_depth);
return 0;
}
迷宫
考试试题
一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由n * n的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。同时当Extense处在某个格点时,他只能移动到东南西北(或者说上下左右)四个方向之一的相邻格点上,Extense想要从点A走到点B,问在不走出迷宫的情况下能不能办到。如果起点或者终点有一个不能通行(为#),则看成无法办到。
时间限制:3000
内存限制:65536
输入
第1行是测试数据的组数k,后面跟着k组输入。每组测试数据的第1行是一个正整数n (1 <= n <= 100),表示迷宫的规模是n * n的。接下来是一个n * n的矩阵,矩阵中的元素为.或者#。再接下来一行是4个整数ha, la, hb, lb,描述A处在第ha行, 第la列,B处在第hb行, 第lb列。注意到ha, la, hb, lb全部是从0开始计数的。
输出
k行,每行输出对应一个输入。能办到则输出“YES”,否则输出“NO”。
样例输入
2
3
.##
…#
#…
0 0 2 2
5
…
###.#
…#…
###…
…#.
0 0 4 0
样例输出
YES
NO
参考答案
在这里插入代码片
Sequence
考试试题
给定m个数字序列,每个序列包含n个非负整数。我们从每一个序列中选取一个数字组成一个新的序列,显然一共可以构造出n^m个新序列。接下来我们对每一个新的序列中的数字进行求和,一共会得到n ^m个和,请找出最小的n个和
时间限制:3000
内存限制:65536
输入
输入的第一行是一个整数T,表示测试用例的数量,接下来是T个测试用例的输入 每个测试用例输入的第一行是两个正整数m(0 < m <= 100)和n(0 < n <= 2000),然后有m行,每行有n个数,数字之间用空格分开,表示这m个序列 序列中的数字不会大于10000
输出
对每组测试用例,输出一行用空格隔开的数,表示最小的n个和
样例输入
1
2 3
1 2 3
2 2 3
样例输出
3 3 4
参考答案
在这里插入代码片
priority queue练习题
考试试题
我们定义一个正整数a比正整数b优先的含义是:
a的质因数数目(不包括自身)比b的质因数数目多;
当两者质因数数目相等时,数值较大者优先级高。
现在给定一个容器,初始元素数目为0,之后每次往里面添加10个元素,每次添加之后,要求输出优先级最高与最低的元素,并把该两元素从容器中删除。
时间限制:2500
内存限制:131072
输入
第一行: num (添加元素次数,num <= 30)
下面10*num行,每行一个正整数n(n < 10000000).
输出
每次输入10个整数后,输出容器中优先级最高与最低的元素,两者用空格间隔。
样例输入
1
10 7 66 4 5 30 91 100 8 9
样例输出
66 5
参考答案
在这里插入代码片