題目描述:
現給出一棵n個結點二叉樹,問這棵二叉樹中最長鏈的長度為多少,保證了1號結點為二叉樹的根。
輸入描述:
輸入的第1行為包含了乙個正整數n,為這棵二叉樹的結點數,結點標號由1至n。
接下來n行,這n行中的第i行包含兩個正整數l[i], r[i],表示了結點i的左兒子與右兒子編號。如果l[i]為0,表示結點i沒有左兒子,同樣地,如果r[i]為0則表示沒有右兒子。
輸出描述:
【樣例說明】
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. 樹的結點無左、右之分,而二叉樹的結點有左、右之分。
關於最長鏈:
最長鏈為這棵二叉樹中一條最長的簡單路徑,即不經過重複結點的一條路徑。可以容易證明,二叉樹中最長鏈的起始、結束結點均為葉子結點。
廣度優先搜尋:
#include
#include
#include
#include
#define maxn 100001
#define maxm 1000001*2
using
namespace
std;
int n,tot,head[maxn],dis[maxn],maxtot,maxt;
struct data
e[maxm];
void add(int u,int v)
int bfs(int u)}}
}return maxt;
}int main()
int t=bfs(1);
bfs(t);
printf("%d",maxtot);
return
0;}
深度優先搜尋:
#include
using
namespace
std;
const
int maxn=100010;
int n,ans,l[maxn],r[maxn],d[maxn];
void dfs(int x)
if(l[x]) dfs(l[x]);
if(r[x]) dfs(r[x]);
ans=max(ans,d[l[x]]+d[r[x]]);
d[x]=max(d[l[x]],d[r[x]])+1;
}int main()
樹上最長子鏈
設d x 表示從結點x出發,走向以x為根的子樹,能夠到達的最短距離,設x的子結點y1,y2.y ty 1,y 2.y t y1 y2 yt 則有 d x ma x di edg e x,yi i 1,2,t d x max d i edge x,y i i 1,2,t d x m ax d i e ...
224 最長數對鏈
題目描述 給出 n 個數對。在每乙個數對中,第乙個數字總是比第二個數字小。現在,我們定義一種跟隨關係,當且僅當 b c 時,數對 c,d 才可以跟在 a,b 後面。我們用這種形式來構造乙個數對鏈。給定乙個對數集合,找出能夠形成的最長數對鏈的長度。你不需要用到所有的數對,你可以以任何順序選擇其中的一些...
646 最長數對鏈
給出 n 個數對。在每乙個數對中,第乙個數字總是比第二個數字小。現在,我們定義一種跟隨關係,當且僅當 b c 時,數對 c,d 才可以跟在 a,b 後面。我們用這種形式來構造乙個數對鏈。給定乙個數對集合,找出能夠形成的最長數對鏈的長度。你不需要用到所有的數對,你可以以任何順序選擇其中的一些數對來構造...