首先,復雜度為n^2的基本方式,將第一個對比節點的父節點全部入棧,而后將堆棧中的父節點序列跟第二個對比節點進行逐一比較,如果相等說明是最近的共同祖先:
- myLCA(node1, node2){
- parentNode :=[]
- while(node1!=NULL){
- parentNode.push(node1)
- node1 := node1.parent
- }
- while(node2!=NULL){
- for i in parentNode.size {
- if(parentNode(i)== node2){
- return node2;
- }
- }
- node2 := node2.parent
- }
- }
在前述方法的基礎上優化一下,先后將兩個對比節點的父節點序列依次入棧,得到兩個可比較的堆棧,然后再循環出棧遍歷,這個時候的順序就是從上到下的遍歷了,第一個不相等的節點表明開始分叉了,那么這個節點之前的所有堆棧中的節點都是共同祖先,應該可以達到O(N+M+L).下面算法找出最近的祖先節點:
- linearLCA(node1, node2){
- parentNode1 :=[]
- while(node1!=NULL){
- parentNode1.push(node1)
- node1 := node1.parent
- }
- parentNode2 :=[]
- while(node2!=NULL){
- parentNode2.push(node2)
- node2 := node2.parent
- }
- while(node1 == node2){
- oldNode1 := node1
- oldNode2 := node2
- node1 := parentNode1.pop()
- node2 := parentNode2.pop()
- }
- return oldNode1
- }