思路:
树的最大高度=父节点孩子的数目+以它的孩子为父节点的子树的最大高度(递归定义)
dfs:从根节点开始递归
可以使用向量 verctor<Type>
C++ Vector_FOOL_amazing的博客-CSDN博客
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
vector<int> f[N]; //f[i]容器是以i结点为父节点的所有子节点
int dfs(int n){
int count=0; //存储每一层的孩子的最大孩子数目
if(f[n].size()==0) return 0;
for(int i=0;i<f[n].size();i++)
{
count=max(count,dfs(f[n][i])); //求节点孩子的最深层数
}
return count+f[n].size();//递归出口count为node结点孩子的最大孩子数目,f[node].size()是node这一层兄弟数目
}
int main(){
int n,t;
cin>>n;
for(int i=2;i<=n;i++){
cin>>t;
f[t].push_back(i); //i节点的父亲是t,所以可以用f[t].size() 求其子节点个数
}
cout<<dfs(1)<<endl;
return 0;
}
dp:对于递归层数太大的时候使用dfs容易超时,dp是从下往上开始
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int f[N],c[N],dp[N]; //f[i]为i的父亲,c[i]为i的孩子数,dp[i] 以i为根结点的最大高度
int main()
{
int n; //表示有n个节点
cin>>n;
for(int i=2;i<=n;i++) //从第二个节点开始
{
cin>>f[i];
}
for(int i=1;i<=n;i++)
{
if(f[i]){ //假如f[2]=1,表示节点2的父节点为1,则节点1的子节点数加1
c[f[i]]++;
}
}
for(int i=n;i>=1;i--){
dp[f[i]]=max(dp[f[i]],dp[i]+c[f[i]]); //
}
cout<<dp[1]<<endl;
return 0;
}