二叉樹問題

2022-08-24 20:21:08 字數 1815 閱讀 6255

如下圖所示的一棵二叉樹的深度、寬度及結點間距離分別為:

深度:4 寬度:4(同一層最多結點個數)

結點間距離: ⑧→⑥為8 (3×2+2=8)

⑥→⑦為3 (1×2+1=3)

注:結點間距離的定義:由結點向根方向(上行方向)時的邊數×2,

與由根向葉結點方向(下行方向)時的邊數之和。

輸入檔案第一行為乙個整數n(1≤n≤100),表示二叉樹結點個數。接下來的n-1行,表示從結點x到結點y(約定根結點為1),最後一行兩個整數u、v,表示求從結點u到結點v的距離。

三個數,每個數占一行,依次表示給定二叉樹的深度、寬度及結點u到結點v間距離。

輸入 #1複製

10                                

1 2

1 3

2 42 5

3 63 7

5 85 9

6 10

8 6

輸出 #1複製

448

經過剖析樣例,我微微思索手動模擬後發現 要找最近的公共祖先,一次次地向上找就好了嘛,其實這有點並查集地意思

尋找時可分為兩種情況

1.兩點在不同子樹中,有公共祖先

2.其中乙個點是另乙個的祖先

那麼**可以這麼寫

誰在下面誰就向上走,u向上時用depp1記錄,v向上時depp2記錄

#include#include

#include

using

namespace

std;

int next[100040

];int to[100040

];int st[1000040

];int de[100040

];int dn[100040

];int ru[100040

];int fa[100040][50

];int n,k,tot=0

;void add(int x,int

y)void build(int num,int

fath)

int lca(int x,int

y)

for(int i=30;i>=0;i--)

for(int i=30;i>=0;i--)

if(fa[x][i]!=fa[y][i])

return fa[x][0];}

intmain()

build(

1,0);

int ma=0

;

for(int i=1;i<=n;i++)

if(de[i]>ma)

ma=de[i];

printf(

"%d\n

",ma);

int lo=0

;

for(int i=1;i<=ma;i++)

if(dn[i]>lo)

lo=dn[i];

printf(

"%d\n

",lo);

intx,y;

scanf(

"%d%d

",&x,&y);

printf(

"%d\n

",2*(de[x]-de[lca(x,y)])+de[y]-de[lca(x,y)]);

return0;

}

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

二叉樹問題 二叉樹層級列印

給定二叉樹的頭結點,按層級列印二叉樹節點值。從上到下按層遍歷,應該是先遍歷到的節點先輸出。因此用佇列作為輔助結構來解此題。層級遍歷中關鍵點要知道什麼時候換層。用兩個變數last 和nlast,分別指向當前層的最右邊和下一層的最右邊節點。當當前層的最右邊節點從佇列中輸出時,表示這一層遍歷完畢了,此時使...

二叉樹問題

mirror of search tree.cpp 定義控制台應用程式的入口點。二叉樹的映象實現,二叉樹的廣度優先遍歷 佇列 include stdafx.h include iostream include queue using namespace std struct bstnode temp...