洛谷P4913【深基16.例3】二叉树深度题解优化Pro Max版
前情提要:不懂什么是 DFS 的小伙伴可以看看一下这段文字(摘自OIwiki):
DFS 最显著的特征在于其 递归调用自身。同时与 BFS 类似,DFS 会对其访问过的点打上访问标记,在遍历图时跳过已打过标记的点,以确保 每个点仅访问一次。符合以上两条规则的函数,便是广义上的 DFS。
具体地说,DFS 大致结构如下:
DFS(v) // v 可以是图中的一个顶点,也可以是抽象的概念,如 dp 状态等。
在 v 上打访问标记
for u in v 的相邻节点
if u 没有打过访问标记 then
DFS(u)
end
end
end
很简单的二叉树遍历问题,和上次一样仍然用dfs(深度优先搜索)解决。
看到数据范围,最大不超过 \(10^6\) ,可以不开 long long
,每个节点只遍历一次,则时间复杂度为 \(O(n)\)
接下来上代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e7+5;
int L[N],R[N],Max=-1;//L[u]表示u的左子节点,R[u]表示U的右子节点,Max为最大深度
void dfs(int u,int dep){//dep为当前节点的深度
if(!L[u]&&!R[u]){//最简子问题(当前节点没有左子节点和右子节点)
Max=max(dep,Max);//打擂台比较深度
return;
}
dfs(L[u],dep+1);
dfs(R[u],dep+1);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>L[i]>>R[i];//输入
}
dfs(1,1);
cout<<Max;//输出
return 0;
}