在樹中尋找兩個結點的最近公共祖先
「從樹的根節點開始進行深度優先搜尋,每次經過某乙個點——無論是從它的父親節點進入這個點,還是從它的兒子節點返回這個點,都按順序記錄下來。這樣就把一棵樹轉換成了乙個陣列。而找到樹上兩個節點的最近公共祖先,無非就是找到這兩個節點最後一次出現在陣列中的位置所囊括的一段區間中深度最小的那個點。轉換出的陣列的長度其實就是邊數的2倍而已,也是o(n)的級別。
#include
#include
#include
#include
#include
using namespace std;
int n=0;
int size = 0;
multimapm ;
string *a;
int *deptha;
int precalculate( int index );
string findmin(int begin, int end);
string query( string name1, string name2 );
void printmap();
void printarray();
int main()
//printmap();
size = 2*n+1;
a= new string[size];
deptha = new int[size];
a[0] = rootfather;
deptha[0] = 0;
precalculate(0 );
//printarray();
int m=0;
scanf( "%d", &m );
for( int i=0; icin>>father;
cin>>child;
cout<}
return 0;
}int precalculate( int index )
pair::iterator,multimap::iterator> p = m.equal_range(fathername);
int nextindex = index+1;
for( it=p.first;it!=p.second;it++)
return --nextindex;
}string query( string name1, string name2 )}}
return findmin(begin,end);
}string findmin(int begin, int end)
}return a[mindepthindex];
}void printmap()
}void printarray()
}
最近公共祖先問題
最近公共祖先 least common ancestors 問題是面試中經常出現的乙個問題,這種問題變種很多,解法也很多。最近公共祖先問題的定義如下 對於有根樹t的兩個結點u v,最近公共祖先lca t,u,v 表示乙個結點x,滿足x是u v的祖先且x的深度盡可能大。另一種理解方式是把t理解為乙個無...
最近公共祖先 python 最近公共祖先
lca演算法樸素演算法 也就是我們所說的暴力演算法,大致的思路是從樹根開始,往下迭代,如果當前結點比兩個結點都小,那麼說明要從樹的右子樹中找 相反則從左子樹中查詢 直到找到乙個結點在當前結點的左邊,乙個在右邊,說明當前結點為最近公共祖先,如果乙個結點是另外乙個結點的祖先,那麼返回前面結點的父親結點即...
最近公共祖先 LCA 最近公共祖先
直接暴力搜尋參考 普通搜尋每次查詢都需要 樸素演算法是一層一層往上找,倍增的話直接預處理出乙個 具體做法是 維護乙個 的關係來線性求出這個陣列 int anc n 31 int dep n 記錄節點深度 void dfs int u,int parent for int i 0 i g u size...