L2-4 小字辈(左子右兄加强版)
因为这个题目已经明确的给出各个节点之间的关系,所以可以使用静态链表来做。依据题目给出的左孩子右兄弟的方式对树进行存储。通过travel函数来实现寻找最大深度,并跟新结果。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
vector<int> ans;
struct node{
int father; // 父节点
int left, right; // 左孩子右兄弟
node(){
father = -1; // 没有父节点
left = right = 0; // 左孩子有兄弟为空
}
}Node[100009];
int n, max_depth;
// 寻找父节点
int findroot(int k){
if(Node[k].father == -1)
return k;
else
return findroot(Node[k].father);
}
// 遍历寻找最小深度
void travel(int root, int depth){
if(depth > max_depth){
max_depth = depth; // 更新
ans.clear(); // 清除
ans.push_back(root);
}
else if(depth == max_depth)
ans.push_back(root);
if(Node[root].left) // 遍历孩子
travel(Node[root].left, depth + 1);
if(Node[root].right) // 遍历兄弟
travel(Node[root].right, depth);
}
int main(void)
{
scanf("%d", &n);
for(int i = 0; i < n; i++){
int a, b, c;
scanf("%d%d%d", &a, &b, &c);
if(b){
Node[a].left = b;
Node[b].father = a;
}
if(c){
Node[a].right = c;
Node[c].father = a;
}
}
int root = findroot(1);
travel(root, 1);
sort(ans.begin(), ans.end());
printf("%d\n", max_depth);
for(int i = 0; i < ans.size(); i++){
printf("%d", ans[i]);
if(i != ans.size() - 1)
printf(" ");
}
return 0;
}