Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define forn(i, n) for (int i = 0; i < (int)(n); ++i)
- struct Tree {
- Tree* l;
- Tree* r;
- Tree* p;
- };
- void dfs(Tree *v, vector<Tree*>& euler) {
- if (!v) {
- return;
- }
- euler.push_back(v);
- dfs(v->l);
- dfs(v->r);
- }
- Tree* findLca(Tree* t, vector<Tree*> lst) {
- unordered_set<Tree*> s;
- forn (i, lst.size()) {
- s.insert(lst[i]);
- }
- vector<Tree*> euler;
- dfs(t, euler);
- int n = euler.size();
- Tree* l = nullptr;
- Tree* r = nullptr;
- forn (i, n) {
- if (s.find(euler[i]) != s.end()) {
- if (!l) {
- l = euler[i];
- }
- r = euler[i];
- }
- }
- int lHeight = 0;
- Tree *v = l;
- while (v) {
- ++lHeight;
- v = v->p;
- }
- int rHeight = 0;
- v = r;
- while (v) {
- ++rHeight;
- v = v->p;
- }
- if (lHeight < rHeight) {
- swap(l, r);
- swap(lHeight, rHeight);
- }
- while (lHeight > rHeight) {
- l = l->p;
- --lHeight;
- }
- while (l != r) {
- l = l->p;
- r = r->p;
- }
- return r;
- }
- int main() {
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement