🐵指尖猴全新升级
第6课:单元实战:家谱树
👨‍👩‍👧‍👦

单元实战:家谱树

用代码存下整个家族的传承!

📖知识引入

🗂️两种存法
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课完成!继续探索下一课吧 🚀