Advertisement
rembocoder

Untitled

May 27th, 2019
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 0.98 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define forn(i, n) for (int i = 0; i < (int)(n); ++i)
  6.  
  7. struct Tree {
  8. Tree* l;
  9. Tree* r;
  10. Tree* p;
  11. };
  12.  
  13. void dfs(Tree *v, vector<Tree*>& euler) {
  14. if (!v) {
  15. return;
  16. }
  17. euler.push_back(v);
  18. dfs(v->l);
  19. dfs(v->r);
  20. }
  21.  
  22. Tree* findLca(Tree* t, vector<Tree*> lst) {
  23. unordered_set<Tree*> s;
  24. forn (i, lst.size()) {
  25. s.insert(lst[i]);
  26. }
  27. vector<Tree*> euler;
  28. dfs(t, euler);
  29. int n = euler.size();
  30. Tree* l = nullptr;
  31. Tree* r = nullptr;
  32. forn (i, n) {
  33. if (s.find(euler[i]) != s.end()) {
  34. if (!l) {
  35. l = euler[i];
  36. }
  37. r = euler[i];
  38. }
  39. }
  40. int lHeight = 0;
  41. Tree *v = l;
  42. while (v) {
  43. ++lHeight;
  44. v = v->p;
  45. }
  46. int rHeight = 0;
  47. v = r;
  48. while (v) {
  49. ++rHeight;
  50. v = v->p;
  51. }
  52. if (lHeight < rHeight) {
  53. swap(l, r);
  54. swap(lHeight, rHeight);
  55. }
  56. while (lHeight > rHeight) {
  57. l = l->p;
  58. --lHeight;
  59. }
  60. while (l != r) {
  61. l = l->p;
  62. r = r->p;
  63. }
  64. return r;
  65. }
  66.  
  67. int main() {
  68. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement