题目一:
AC代码:
#include <stdio.h>
// 宏 _for 用于简化 for 循环
#define _for(i, a, b) for (int i = (a); i <= (b); i++)
// 最大节点数
#define MAXN 1000010
// 树节点结构体
typedef struct {
int left;
int right;
} Node;
// 树节点数组
Node tree[MAXN];
// 节点数和最大深度
int n, ans;
// 深度优先搜索
void dfs(int id, int deep) {
// 如果当前节点编号为 0,说明到达叶子节点,返回
if (id == 0) return;
// 更新最大深度
if (deep > ans) {
ans = deep;
}
// 递归遍历左子树
dfs(tree[id].left, deep + 1);
// 递归遍历右子树
dfs(tree[id].right, deep + 1);
}
int main() {
// 读取节点数
scanf("%d", &n);
// 每个节点的左右子节点信息,构建树
_for(i, 1, n) {
scanf("%d %d", &tree[i].left, &tree[i].right);
}
// 从 1 号节点开始进行深度优先搜索,初始深度为 1
dfs(1, 1);
//输出
printf("%d\n", ans);
return 0;
}
整体思路:
此代码目的是计算二叉树最大深度,先读取节点信息构建二叉树,再用深度优先搜索(DFS)遍历树,记录并更新最大深度。
具体方法:
-
宏定义:
-
_for
简化for
循环,减少代码输入量。 -
MAXN
规定树的最大节点数,为数组分配空间。
-
-
结构体定义:
-
Node
结构体表示树节点,含left
和right
分别存左右子节点编号。
-
-
全局变量:
-
tree
数组存树节点信息。 -
n
记录节点数,ans
记录最大深度。
-
-
深度优先搜索(DFS):
-
dfs
函数接收节点编号id
和当前深度deep
。 -
若
id
为 0,说明到叶子节点,函数返回。 -
若当前深度
deep
大于ans
,更新ans
。 -
递归调用
dfs
遍历左子树和右子树,深度加 1。
-
-
主函数:
-
读取节点数
n
。 -
用
_for
循环读取每个节点的左右子节点信息存于tree
数组。 -
从 1 号节点开始 DFS,初始深度为 1。
-
输出最大深度
ans
。
-
题目二:
#include <stdio.h>
#define MAX_SIZE 1000
long long stk[MAX_SIZE];
int main() {
long long i = 0, now = 0;
char op;
// 循环读取输入字符,直到遇到 '@' 结束
while ((op = getchar()) != '@') {
if (op >= '0' && op <= '9') {
// 如果是数字字符,更新当前数字的值
now *= 10;
now += op - '0';
} else if (op == '.') {
// 遇到 '.' 表示一个数字结束,将其存入栈中
stk[++i] = now;
now = 0;
} else if (op == '+') {
// 遇到 '+' 进行加法运算
stk[i - 1] = stk[i - 1] + stk[i];
stk[i] = 0;
i--;
} else if (op == '-') {
// 遇到 '-' 进行减法运算
stk[i - 1] = stk[i - 1] - stk[i];
stk[i] = 0;
i--;
} else if (op == '*') {
// 遇到 '*' 进行乘法运算
stk[i - 1] = stk[i - 1] * stk[i];
stk[i] = 0;
i--;
} else if (op == '/') {
// 遇到 '/' 进行除法运算
stk[i - 1] = stk[i - 1] / stk[i];
stk[i] = 0;
i--;
}
}
// 输出最终结果
printf("%lld", stk[1]);
return 0;
}
整体思路:
此代码用于计算逆波兰表达式(后缀表达式)的值。通过栈来存储操作数,按顺序读取表达式中的字符,遇到数字就解析出来存入栈,遇到运算符就从栈中取出操作数进行相应运算,结果再存回栈,最终栈顶元素即为表达式结果。
具体方法:
-
变量与栈定义:
-
MAX_SIZE
规定栈的最大容量。 -
stk
数组作为栈存储操作数。 -
i
作为栈顶指针,now
用于临时存储解析的数字。 -
op
存储每次读取的字符。
-
-
循环读取表达式:
-
使用
while
循环,持续读取字符,直到遇到@
结束。
-
-
处理不同字符:
-
数字字符:若
op
是数字,将now
乘 10 并加上该数字的值,完成数字拼接。 -
小数点:遇到
.
表示一个数字解析结束,将now
存入栈,i
加 1,now
清零。 -
运算符:遇到
+
、-
、*
、/
时,从栈中取出两个操作数,进行相应运算,结果存回栈顶前一个位置,栈顶置 0,i
减 1。
-
-
输出结果:
-
循环结束后,栈底元素(
stk[1]
)即为最终计算结果,将其输出。
-
题目三:
#include <stdio.h>
// 最大行数
#define MAX_ROWS 30
//每行元素个数
#define MAX_COLS 3
// 全局变量 n 用于存储行数
int n;
// 二维字符数组 a 用于存储字符信息
char a[MAX_ROWS + 1][MAX_COLS];
// 递归 f 用于进行前序遍历
void f(char x) {
// 如果当前字符不是 '*'
if (x != '*') {
// 输出当前字符
printf("%c", x);
// 遍历数组 a 的每一行
for (int i = 1; i <= n; i++) {
// 如果当前行的第一个字符等于 x
if (a[i][0] == x) {
// 调用 f 函数处理左子节点
f(a[i][1]);
//调用 f 函数处理右子节点
f(a[i][2]);
}
}
}
return;
}
int main() {
// 读取行数 n
scanf("%d", &n);
// 循环读取 n 行数据,每行包含 3 个字符
for (int i = 1; i <= n; i++) {
scanf(" %c %c %c", &a[i][0], &a[i][1], &a[i][2]);
}
// 从第一行的第一个字符开始进行前序遍历
f(a[1][0]);
// 输出换行符
printf("\n");
return 0;
}
整体思路:
这段代码的主要功能是对一棵二叉树进行前序遍历并输出结果。通过读取输入的二叉树节点信息存储在二维数组中,然后利用递归函数对二叉树进行前序遍历。
具体方法:
-
宏定义与全局变量:
-
MAX_ROWS
和MAX_COLS
分别定义最大行数和每行元素个数。 -
n
存储输入的行数,a
二维数组存储二叉树节点信息。
-
-
递归函数
f
:-
接收一个字符
x
作为当前节点。 -
若
x
不是*
,输出x
。 -
遍历数组
a
,找到以x
为根节点的行,递归处理其左右子节点。
-
-
主函数
main
:-
读取行数
n
。 -
循环读取
n
行数据,每行 3 个字符存入a
数组。 -
从第一行第一个字符开始调用
f
函数进行前序遍历。 -
输出换行符结束程序。
-