1814 最長鏈
時間限制: 1 s
空間限制: 256000 KB
題目等級 : 鑽石 Diamond
題目描述 Description
現給出一棵N個結點二叉樹,問這棵二叉樹中最長鏈的長度為多少,保證了1號結點為二叉樹的根。
輸入描述 Input Description
輸入的第1行為包含了一個正整數N,為這棵二叉樹的結點數,結點標號由1至N。
接下來N行,這N行中的第i行包含兩個正整數l[i], r[i],表示了結點i的左兒子與右兒子編號。如果l[i]為0,表示結點i沒有左兒子,同樣地,如果r[i]為0則表示沒有右兒子。
輸出描述 Output Description
輸出包括1個正整數,為這棵二叉樹的最長鏈長度。
樣例輸入 Sample Input
5
2 3
4 5
0 6
0 0
0 0
樣例輸出 Sample Output
4
資料範圍及提示 Data Size & Hint
【樣例說明】
4-2-1-3-6為這棵二叉樹中的一條最長鏈。
【資料規模】
對於10%的資料,有N≤10;
對於40%的資料,有N≤100;
對於50%的資料,有N≤1000;
對於60%的資料,有N≤10000;
對於100%的資料,有N≤100000,且保證了樹的深度不超過32768。
【提示】
關於二叉樹:
二叉樹的遞迴定義:二叉樹要麼為空,要麼由根結點,左子樹,右子樹組成。左子樹和右子樹分別是一棵二叉樹。
請注意,有根樹和二叉樹的三個主要差別:
1. 樹的結點個數至少為1,而二叉樹的結點個數可以為0;
2. 樹中結點的最大度數沒有限制,而二叉樹結點的最大度數為2;
3. 樹的結點無左、右之分,而二叉樹的結點有左、右之分。
關於最長鏈:
最長鏈為這棵二叉樹中一條最長的簡單路徑,即不經過重複結點的一條路徑。可以容易證明,二叉樹中最長鏈的起始、結束結點均為葉子結點。
分類標籤 Tags 點此展開
1 #include<cstdio> 2 #include<algorithm> 3 using namespace std; 4 int n,i,ans,a[100000][3],c[100000]; 5 void dfs(int x) 6 { 7 int l=a[x][1],r=a[x][2]; 8 if (a[x][1]!=0) dfs(l); 9 if (a[x][2]!=0) dfs(r); 10 c[x]=max(c[l],c[r])+1; 11 ans=max(c[l]+c[r]+1,ans); 12 } 13 int main() 14 { 15 scanf("%d",&n); 16 for (i=1;i<=n;i++) 17 scanf("%d%d",&a[i][1],&a[i][2]); 18 dfs(1); 19 printf("%d",ans-1); 20 }