提高级-算法总结--树1
feizhu_QWQ · · 算法·理论
(。・∀・)ノ゙嗨飞竹小课堂第
好好好,今天终于开始学
#include<bits/stdc++.h>
using namespace std;
int da[100005];
int vis[1000005];
int n,m;
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y;
cin>>x>>y;
da[y]=x;
vis[x]++;
}
int maxn=-2e9,ans,ans2;
for(int i=1;i<=n;i++)
{
if(da[i]==0) ans2=i;
if(vis[i]>maxn)
{
maxn=vis[i];
ans=i;
}
}
cout<<ans2<<endl<<ans<<endl;
for(int i=1;i<=n;i++)
{
if(da[i]==ans) cout<<i<<" ";
}
return 0;
}
二叉树深度
这道题让我们求的是二叉树的深度,我们可以先把左子节点和右子节点存在结构体里,然后
#include<bits/stdc++.h>
using namespace std;
vector<int> op[1000005];
bool vis[1000005];
int n,m,maxn=-2e9;
void dfs(int x,int step)
{
if(op[x][0]==0&&op[x][1]==0) maxn=max(maxn,step);
if(op[x][0]!=0) dfs(op[x][0],step+1);
if(op[x][1]!=0) dfs(op[x][1],step+1);
return;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
int x,y;
cin>>x>>y;
op[i].push_back(x);
op[i].push_back(y);
}
dfs(1,1);
cout<<maxn;
return 0;
}
或者说用飞竹带来的模板,这个模板可以处理大部分题目,且不仅适用于二叉树,还可以求深度,子树大小:
void dfs(int x,int da)
{
siz[x]=1;//子树大小,自己也算进去,所以一开始为1
dep[x]=dep[da]+1;//每个点的深度,子节点深度=父节点深度+1
for(int i=0;i<op[x].size();i++)//遍历所有子节点
{
int v=op[x][i];//代表i下一个去的节点
if(v!=da)//判断有没有立马走回来,也就是重复走
{
dfs(v,x);//dfs
siz[x]+=siz[v];
//在dfs后计算字数大小,子树大小等于自己的所有子节点的子树大小再+1
}
}
return;
}
//这里判断有没有重复走是不用$vis$的,因为如果重复走,他只会走到自己的父节点,我们正好传了参,可以直接判断QWQ
我宣布,今天的树结束啦QWQ!
下课!
ヾ( ̄▽ ̄)Bye~Bye~