作业介绍
树的存储父子结构
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
int n ; //根节点数
cin >> n ;
//创建一个存储树结构的数组 下标表示子节点,值表示父节点
vector<int> tree(n+1,0);//索引0不能用,初始化为0
//读取数据
for(int i = 0 ; i< n - 1 ; i++){
int parent , child;
cin >> parent >> child;
tree[child] = parent;
}
//1、寻找根节点
int root = 0 ;
for(int i = 1 ; i<= n ; i++){
if(tree[i] == 0){
root = i ;
break;
}
}
cout << root << endl;
//2、孩子最多的节点
//2.1 统计每个节点的孩子数量
//定义一个数组,用来存储每个节点的孩子数量
vector<int> childCount(n+1,0);
//存储父节点的孩子数量
for(int i = 1 ; i <= n ; i++){
if(tree[i] !=0) childCount[tree[i]]++;
}
//2.2 寻找孩子最多的节点
int max_node = 0 , max_count = 0;
for(int i = 1 ; i <= n ; i++){
if(childCount[i] > max_count){
max_count = childCount[i];
max_node = i ;
}else if(childCount[i] == max_count && i < max_node){
max_node = i ;
}
}
cout << max_node << endl;
//3、max的孩子
//3.1 max的所有孩子
vector<int> children;
for(int i = 1 ; i <= n ; i ++){
if(tree[i] == max_node) children.push_back(i);
}
//3.2 将所有孩子排序
sort(children.begin(),children.end()) ;
//3.3 打印输出
for(int child : children)
cout << child << " ";
return 0;
}
树的高度
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 探索家族关系并记录信息
void exploreFamily(vector<vector<int>>& relations, vector<int>& parent, vector<int>& depth) {
queue<int> familyQueue; // 家族探索队列
// 从爷爷(1)开始
familyQueue.push(1);
depth[1] = 1; // 爷爷的辈分是1
while (!familyQueue.empty()) {
int current = familyQueue.front(); // 当前探索的人
familyQueue.pop();
// 检查所有和当前人有关系的人
for (int relative : relations[current]) {
// 如果这个人还没有被分配辈分(说明不是父母)
if (depth[relative] == 0) {
depth[relative] = depth[current] + 1; // 辈分比当前人多1
parent[relative] = current; // 当前人是他的父亲
familyQueue.push(relative); // 继续探索他的家庭
}
}
}
}
int main() {
int n; // 总人数
cin >> n;
// 准备记录本
vector<vector<int>> relations(n+1); // 关系网:每个人和谁有关系
vector<int> parent(n+1, 0); // 父节点记录本
vector<int> depth(n+1, 0); // 辈分记录本
// 读入关系信息
int edges = n - 1; // 关系数量
for (int i = 0; i < edges; i++) {
int a, b;
cin >> a >> b;
// 记录双向关系(a认识b,b也认识a)
relations[a].push_back(b);
relations[b].push_back(a);
}
// 探索家族关系
exploreFamily(relations, parent, depth);
// 输出结果(从2号开始)
for (int i = 2; i <= n; i++) {
cout << i << " " << parent[i] << " " << depth[i] << endl;
}
return 0;
}
树的深度优先搜索
#include <iostream>
#include <vector>
using namespace std;
// 深度优先遍历方法
void dfs_traversal(vector<vector<int>>& children, int current, vector<int>& result) {
// 1. 访问当前节点(记录到结果中)
result.push_back(current);
// 2. 按顺序探索所有孩子(树枝)
for (int kid : children[current]) {
// 3. 递归探索每个子树
dfs_traversal(children, kid, result);
}
}
int main() {
int n; // 总节点数
cin >> n;
// 创建树结构:存储每个节点的孩子
vector<vector<int>> children(n+1); // 0号位置不用,从1开始
// 读入父子关系
for (int i = 0; i < n-1; i++) {
int father, child;
cin >> father >> child;
children[father].push_back(child); // 把孩子加入父亲的列表
}
vector<int> result; // 存储遍历结果
// 调用DFS方法进行遍历(从根节点1开始)
dfs_traversal(children, 1, result);
// 输出结果(注意空格格式)
for (int i = 0; i < result.size(); i++) {
if (i == 0) {
cout << result[i]; // 第一个不加空格
} else {
cout << " " << result[i]; // 后面加空格
}
}
return 0;
}
树的广度优先搜索
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 广度优先遍历方法
vector<int> bfs_traversal(vector<vector<int>>& family, int start) {
vector<int> result; // 存储遍历结果
queue<int> line; // 排队队列
line.push(start); // 从起点开始排队
while (!line.empty()) {
int current = line.front(); // 当前点到的人
line.pop(); // 点完名离开队列
result.push_back(current); // 记录当前人
// 让当前人的所有孩子加入队列
for (int kid : family[current]) {
line.push(kid);
}
}
return result;
}
int main() {
int n; // 总人数
cin >> n;
// 创建家谱图:每个父亲的孩子列表
vector<vector<int>> family(n+1); // 0号位置不用,从1开始
// 读入父子关系
for (int i = 0; i < n-1; i++) {
int father, child;
cin >> father >> child;
family[father].push_back(child); // 把孩子加入父亲的家谱
}
// 调用BFS方法进行遍历
vector<int> sequence = bfs_traversal(family, 1);
// 输出结果(注意空格格式)
for (int i = 0; i < sequence.size(); i++) {
if (i == 0) {
cout << sequence[i]; // 第一个不加空格
} else {
cout << " " << sequence[i]; // 后面加空格
}
}
return 0;
}
题目
认领作业后才可以查看作业内容。
- 状态
- 正在进行…
- 题目
- 4
- 开始时间
- 2025-6-1 0:00
- 截止时间
- 2025-6-9 23:59
- 可延期
- 24 小时