codevs 1814 最長鏈

自為風月馬前卒發表於2017-04-19

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 }

 

相關文章