【题目描述】
现给出一棵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; }