题解 P4913 【深基16.例3】二叉树深度
第一次写树有关的题解,如果有不严谨的地方望指正
首先让我们看题,题目说给出一棵树每个节点的儿子节点,如果是叶子节点就是0 0
那么我们就可以直接暴力存下这颗树了
开一个结构体,存当前节点的两个儿子
然后一个一个的遍历树的节点(这里数据小并不用任何优化和算法)
- 开一个数组dep记录当前深度
- 每一个儿子节点x得到深度,都是由它的父亲贡献而来的,每往下搜一个节点,这dep[son[x].l]就是由 dep[x] + 1贡献来的
- 搜它的儿子节点
以上就是大概的思路了
注意:初始深度一定要设为1,因为树根也是一层
#include<bits/stdc++.h> using namespace std; int n, ans; int dep[100101];//存深度的数组 struct fff{ int l, r; }son[1001010];//存左右儿子的结构体 void dfs (int x) { if (x == 0) return;//输入说了叶子节点是0,然而节点编号并没有0,所以可以大胆的遇到0就返回 dep[son[x].l] = dep[x] + 1; dfs (son[x].l);//搜它的左儿子 dep[son[x].r] = dep[x] + 1; dfs (son[x].r);//搜它的右儿子 } int main() { cin >> n; for (int i = 1; i <= n; i ++) { int x, y; cin >> x >> y; son[i].l = x, son[i].r = y; } dep[1] = 1;//初始深度 dfs(1); for (int i = 1; i <= n; i ++) ans = max(dep[i], ans); //最大深度肯定是从所有深度中得来的,打一遍擂台即可 cout << ans;//输出答案 return 0; }