尋找最近公共祖先(leecode 236)

2021-10-22 21:48:50 字數 883 閱讀 6385

尋找最近公共祖先(leecode 236)

尋找最近公共祖先分析:

該題明顯採用回溯的思維,自底向上尋找p,q,找到後便返回,p,q節點,沒找到就返回null。可以考慮用後序遍歷進行回溯。

第1種情況:

root的左右兩棵子樹l,r應該非空,此時root是最近公共祖先,最後返回root;

第2種情況:

如果root等於其中乙個節點,那麼root的其中一棵子樹非空,另一棵為null;或者兩個都為空直接返回root;

當找到root後,root所在的子樹非空,另一棵為null,所以沿著路徑返回非空的節點。

ps:== 後序遍歷可回溯==

class

solution

treenode* l =

postorder

(root-

>left, p, q)

; treenode* r =

postorder

(root-

>right, p, q);if

(l !=

nullptr

&& r !=

nullptr

)else

if(l !=

nullptr

&& r ==

nullptr

)else

if(l ==

nullptr

&& r !=

nullptr

)return

nullptr;}

treenode*

lowestcommonancestor

(treenode* root, treenode* p, treenode* q)

};

尋找最近公共祖先演算法(LCA)

最近做乙個功能,需要對場景圖中的多個節點回溯其最近公共祖先,這是乙個常用的應用,搜尋了一下,有tarjan演算法。tarjan演算法是一種離線演算法,它需要一次輸入所有的詢問,然後有根節點開始進行深度優先遍歷 dfs 在深度優先遍歷的過程中,進行並查集 見文章參考鏈結 的操作,同時查詢詢問,返回結果...

最近公共祖先 python 最近公共祖先

lca演算法樸素演算法 也就是我們所說的暴力演算法,大致的思路是從樹根開始,往下迭代,如果當前結點比兩個結點都小,那麼說明要從樹的右子樹中找 相反則從左子樹中查詢 直到找到乙個結點在當前結點的左邊,乙個在右邊,說明當前結點為最近公共祖先,如果乙個結點是另外乙個結點的祖先,那麼返回前面結點的父親結點即...

最近公共祖先 LCA 最近公共祖先

直接暴力搜尋參考 普通搜尋每次查詢都需要 樸素演算法是一層一層往上找,倍增的話直接預處理出乙個 具體做法是 維護乙個 的關係來線性求出這個陣列 int anc n 31 int dep n 記錄節點深度 void dfs int u,int parent for int i 0 i g u size...