青少年软件编程(202209)(C语言)(树&堆&图)等级考试(七级)试题及参考答案

等级标准

  1. 掌握数据结构中的二叉树;
  2. 掌握数据结构中的堆;
  3. 掌握数据结构中的图 ;
  4. 掌握空间效率分析的基本方法;
  5. 能够使用上述方法编写指定功能的正确完整的程序。

二叉树的深度

考试试题

给定一棵二叉树,求该二叉树的深度
二叉树深度定义:从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的节点个数为树的深度

时间限制: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

参考答案

在这里插入代码片
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值