9.3 树的遍历
9.3 树的遍历
http://codeup.hustoj.com/contest.php?cid=100000612
A 树查找

题目解析
这道题指明树是完全二叉树,依次输入结点。
对完全二叉树当中的任何一个结点(设编号为x),其左孩子的编号是2x,右孩子编号是2x+1
❗根结点必须从1开始!!!(否则2*0=0)
所以大体解题思路:
1️⃣ 使用Node[maxn] 数组存储树的结点,对当前下标为x的结点,可通过下标2x访问其左孩子,2x+1访问其右孩子
2️⃣ 输入的是结点的data,需要记录层次,所以node结构体中有成员data、layer
3️⃣ 使用BFS遍历整棵树,存储d层次的结点
(之所以存储下来而不是直接输出,因为土题目要求节点间用空格隔开,最后一个节点后没有空格)
4️⃣ 输出存储的d层次的结点
代码
#include <cstdio>
#include <queue>
#define maxn 1005
using namespace std;
struct node {
int data;
int layer;
} Node[maxn];
int n, d; //结点个数,深度
int ans[maxn], digit;
void BFS(int root) {
queue<int> q;
Node[root].layer = 1;
q.push(root);
while (!q.empty()) {
int front = q.front();
if (Node[front].layer == d) {
ans[digit++] = Node[front].data;
}
q.pop();
//左孩子存在
if (2 * front <= n) {
Node[2 * front].layer = Node[front].layer + 1;
q.push(2 * front);
}
if (2 * front + 1 <= n) {
Node[2 * front + 1].layer = Node[front].layer + 1;
q.push(2 * front + 1);
}
}
}
int main() {
while (scanf("%d", &n) && n!=0) {
for (int i = 1; i <= n; i++) {
scanf("%d", &Node[i].data);
}
scanf("%d", &d);
digit = 0;
BFS(1);
if (digit == 0) printf("EMPTY\n");
else {
for (int i = 0; i < digit; i++) {
printf("%d", ans[i]);
if (i < digit - 1) printf(" ");
else printf("\n");
}
}
}
return 0;
}
B 树的高度

题目解析
这道题考察的是普通树的遍历,用数组存储树的所有结点
因为输入的是树各个结点之间的关系,所以node结构体不用存储data。因为要输出树的高度,所以要记录layer
(用vector<int> child存储此结点所有的孩子结点)
⚠️ 唯一要注意一点:
一开始没有用ans在BFS过程中记录最大的结点layer,认为Node[n].layer一定最大,直接在main中输出Node[n].layer,结果WA。(🙃maybe 结点不一定按照层数顺序编号,可能会有大的结点在较低高度的情况)
代码
#include <cstdio>
#include <vector>
#include <queue>
#define maxn 105 //随便写的大小,题目没说,但是AC了
using namespace std;
struct node {
int layer;
vector<int> child;
} Node[maxn];
int n, ans;
void BFS(int root) {
queue<int> q;
Node[root].layer = 1;
q.push(root);
while (!q.empty()) {
int front = q.front();
q.pop();
if (Node[front].layer > ans) ans = Node[front].layer; //!!重要
for (int i = 0; i < Node[front].child.size(); i++) {
int child = Node[front].child[i];
Node[child].layer = Node[front].layer + 1;
q.push(child);
}
}
}
int main() {
int a, b;
while (scanf("%d", &n) != EOF) {
for (int i = 0; i < n - 1; i++) {
scanf("%d%d", &a, &b);
Node[a].child.push_back(b);
}
ans = 0;
BFS(1);
printf("%d\n", ans);
}
return 0;
}
本文作者:Joey-Wang
本文链接:https://www.cnblogs.com/joey-wang/p/14541182.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步