最長鏈(遞迴)

2022-03-14 12:22:25 字數 1661 閱讀 9946

題目描述:

現給出一棵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 後面。我們用這種形式來構造乙個數對鏈。給定乙個數對集合,找出能夠形成的最長數對鏈的長度。你不需要用到所有的數對,你可以以任何順序選擇其中的一些數對來構造...