洛谷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;
}
posted @ 2024-11-21 13:43  chengliye  阅读(0)  评论(0编辑  收藏  举报

My\large My GitHub\large GitHub