PAT刷題模板 LCA最近公共祖先

2021-10-06 10:19:56 字數 866 閱讀 2295

void

lca(

int root,

int start,

int end,

int a,

int b)

傳統的鍊錶形式可以先遍歷得到pre和in兩個陣列,然後進行查詢

先補充結論:

中序遍歷中 a 和 b 的最小公共祖先 lca 一定在 a ~ b 的區間內 (lnr)

先序遍歷中 a 和 b 的最小公共祖先 lca 一定在 a 和 b 之前 (nlr);後序遍歷中 a 和 b 的最小公共祖先 lca 一定在 a 和 b 之後 (lrn)

先序遍歷中第乙個遇到的在 a ~ b(中序) 之間的元素即為 lca (先序特點是先到lca結點 再到a b結點);後序遍歷中最後乙個遇到的在 a ~ b 之間的元素即為 lca

想不明白的可以畫個圖,看一看前序和中序是如何遍歷整棵樹的

void

lca_t

(int a,

int b,

int n)

if(ain == lcain)

printf

("%d is an ancestor of %d.\n"

, a, b)

;else

if(bin == lcain)

printf

("%d is an ancestor of %d.\n"

, b, a)

;else

printf

("lca of %d and %d is %d.\n"

, a, b, in[lcain]);

}

模板 最近公共祖先(LCA)

題自洛谷 如題,給定一棵有根多叉樹,請求出指定兩個點直接最近的公共祖先。輸入格式 第一行包含三個正整數n m s,分別表示樹的結點個數 詢問的個數和樹根結點的序號。接下來n 1行每行包含兩個正整數x y,表示x結點和y結點之間有一條直接連線的邊 資料保證可以構成樹 接下來m行每行包含兩個正整數a b...

模板 lca 最近公共祖先

lca hljs cpp include include using namespace std const int maxn 500001 int n,m,gen,x,y struct edgeedge 2 maxn int deep maxn fa maxn 20 deep記錄每個點的深度,fa...

最近公共祖先 LCA 模板

lca即最近公共祖先,是指 在有根樹中,找出某兩個結點u和v最近的公共祖先。時間複雜度o nlogn m n 步驟 1.將樹看作乙個無向圖,從根節點開始深搜,得到乙個遍歷序列。2.在x y區間中利用rmq演算法找到深度最小返回其下標。可以上洛谷找模板題測試 include include inclu...