2024 年 12 月青少年软编等考 C 语言七级真题解析
发布时间:2026/10/5 6:31:12 作者:尧图编辑部 阅读量:1,286

目录T1. 翻转二叉树思路分析T2. 电信诈骗思路分析T3. 二叉树的秩思路分析T4. 反推决策树思路分析T1. 翻转二叉树题目链接:SOJ D1364迈克斯·豪威尔是 Mac 上著名软件 Homebrew 的作者,他去谷歌面试的时候,被每天使用他的软件工作的工程师给拒绝了,因为他没能在白板上写出翻转二叉树的代码……现在你的机会来了,请证明你会写翻转二叉树(将树中每个结点的左右孩子互换)的程序!时间限制:1 s内存限制:64 MB输入输入第一行给出正整数N NN(≤ 10 ≤ 10≤10),是树中结点的个数(结点从0 00到N − 1 N-1N−1编号)。随后N NN行,第i ii行(i = 0 , … , N − 1 i=0, … , N-1i=0,…,N−1)给出编号为i ii的结点的左、右孩子的编号。如果该孩子结点不存在,则在相应位置上用-表示。孩子结点间以一个空格分隔。输出首先将输入的二叉树进行翻转,然后第一行输出结果树的层序遍历序列,第二行给出其中序遍历序列。数字间必须以1 11个空格分隔,行首尾不得有多余空格。样例输入8 1 - - - 0 - 2 7 - - - - 5 - 4 6样例输出3 7 2 6 4 0 5 1 6 5 7 4 3 2 0 1思路分析此题考查二叉树的翻转与遍历,属于基础题。首先遍历输入,记录每个节点的左右孩子,同时通过入度统计找到根节点(入度为0 00的节点)。至于翻转过程,可以采用递归方式实现,对每个节点交换其左右孩子,本质是后序遍历的过程(先翻转左、右子树,再交换当前节点的左右孩子)。/* * Name: T1.cpp * Problem: 翻转二叉树 * Author: Teacher Gao. * DateTime: 2026/08/25 14:20 */#includebits/stdc++.husingnamespacestd;constintMAXN=15;intd[MAXN],L[MAXN],R[MAXN];vectorintlevelRes,midRes;voidreverse(intrt){if(rt==-1)return;reverse(L[rt]);reverse(R[rt]);swap(L[rt],R[rt]);}voidlevelOrder(intrt){queueintQ;Q.push(rt);while(!Q.empty()){intx=Q.front();Q.pop();coutx" ";if(L[x]!=-1)Q.push(L[x]);if(R[x]!=-1)Q.push(R[x]);}coutendl;}voidmidOrder(intrt){if(rt==-1)return;midOrder(L[rt]);coutrt" ";midOrder(R[rt]);}intmain(){intN;memset(L,-1,sizeof(L));memset(R,-1,sizeof(R));cinN;for(inti=0;iN;++i){string x,y;cinxy;if(x!="-"){L[i]=stoi(x);d[L[i]]++;}if(y!="-"){R[i]=stoi(y);d[R[i]]++;}}introot=-1;for(inti=0;iN;++i){if(d[i]==0){root=i