尋找最近公共祖先(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...