最长链

【题目描述】

现给出一棵N个结点二叉树,问这棵二叉树中最长链的长度为多少,保证1号结点为二叉树的根。

【输入描述】

输入的第1行包含一个正整数N,为这棵二叉树的结点数,结点标号为1~N;

接下来N行,第i行包含两个正整数L[i]、R[i],表示了结点i的左儿子与右儿子编号。

如果L[i]=0,表示结点i没有左儿子,如果R[i]=0,则表示没有右儿子。

【输出描述】

输出包含1个正整数,为这棵二叉树的最长链长度。

【样例输入】

5

2 3

4 5

0 6

0 0

0 0

【样例输出】

4

【数据范围及提示】

样例中,4-2-1-3-6为这棵二叉树中的一条最长链。

对于10%的数据,N ≤ 10;

对于40%的数据,N ≤ 100;

对于50%的数据,N ≤ 1000;

对于60%的数据,N ≤ 10000;

对于100%的数据,N ≤ 100000,且保证树的深度不超过32768。

源代码:

#include<cstdio>
#include<algorithm>
using namespace std;
int n,Ans,i[100001][2],f[100001]={0};
void DFS(int t) //类似于树形DP。
{
    if (i[t][0])
      DFS(i[t][0]);
    if (i[t][1])
      DFS(i[t][1]);
    f[t]=max(f[i[t][0]],f[i[t][1]])+1;
    Ans=max(f[i[t][0]]+f[i[t][1]]+1,Ans); //仔细想一想,其实就是这种链。
}
int main()
{
    scanf("%d",&n);
    for (int a=1;a<=n;a++)
      scanf("%d%d",&i[a][0],&i[a][1]);
    DFS(1);
    printf("%d",Ans-1); //奇怪的输出。
    return 0;
}
原文地址:https://www.cnblogs.com/Ackermann/p/5838567.html