如下圖所示的一棵二叉樹的深度、寬度及結點間距離分別為:
深度: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複製1 2
1 3
2 42 5
3 63 7
5 85 9
6 10
8 6
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...