第6课:单元实战:家谱树
进度 0/24
👨👩👧👦
单元实战:家谱树
用代码存下整个家族的传承!
📖知识引入
🗂️两种存法
fa数组存父亲方便向上查,children数组存孩子方便向下走
🔍找祖先
沿fa数组一路向上直到根,路过的人全是长辈
📊算辈分
深度=父亲深度+1,从根DFS一次全家辈分全算完
🧭建模心法
先把家谱关系画成树,再决定用哪种存法最顺手
💡
向上找祖先用fa数组最省事,向下遍历子孙用children数组最顺手——按需求选工具
🔍家谱树:存孩子+算辈分
#include <iostream>
#include <vector>
using namespace std;
vector<int> children[105]; // 每个人的孩子列表
int generation[105]; // 记录每个人是第几代
void dfs(int u, int gen) {
generation[u] = gen;
for (int v : children[u]) dfs(v, gen + 1); // 孩子多一代
}
int main() {
children[1] = {2, 3}; // 1号的孩子是2、3
children[2] = {4}; // 2号的孩子是4
dfs(1, 1); // 1号是第1代
cout << "4号是第" << generation[4] << "代" << endl; // 第3代
return 0;
}children数组记下每个人的孩子,一次DFS算出全家族谱辈分。
🎯小测验
第1题:fa[x]里存的是什么?
第2题:求节点深度的递推式是?
第3题:fa数组表示下,根节点的fa值通常是?
📝本课知识点
- ✓fa数组适合向上查
- ✓children适合向下遍历
- ✓先画图再选存法
第6课完成!继续探索下一课吧 🚀
