题目地址:
https://www.luogu.com.cn/problem/P4913
题目描述:
给出每个节点的两个儿子节点,建立一棵二叉树(根节点为
1
1
1),如果是叶子节点,则输入
0
0
0。建好树后希望知道这棵二叉树的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。最多有
1
0
6
10^6
106个结点。
输入格式
无
输出格式
无
代码如下:
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int h[N], e[N], ne[N], idx;
int res;
void add(int a, int b) {
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void dfs(int u, int depth) {
if (!u) {
res = max(res, depth);
return;
}
for (int i = h[u]; ~i; i = ne[i])
dfs(e[i], depth + 1);
}
int main() {
scanf("%d", &n);
memset(h, -1, sizeof h);
for (int i = 1; i <= n; i++) {
int l, r;
scanf("%d%d", &l, &r);
add(i, l), add(i, r);
}
dfs(1, 0);
printf("%d\n", res);
return 0;
}
时间复杂度 O ( n ) O(n) O(n), n n n为节点个数,空间 O ( h ) O(h) O(h), h h h为树高。