Data Structure Binary Tree: Lowest Common Ancestor in a Binary Tree

http://www.geeksforgeeks.org/lowest-common-ancestor-binary-tree-set-1/

 1 #include <iostream>

 2 #include <vector>

 3 #include <algorithm>

 4 #include <queue>

 5 #include <stack>

 6 #include <string>

 7 #include <fstream>

 8 #include <map>

 9 using namespace std;

10 

11 struct node {

12     int data;

13     struct node *left, *right;

14     node() : data(0), left(NULL), right(NULL) { }

15     node(int d) : data(d), left(NULL), right(NULL) { }

16 };

17 

18 bool findpath(node *root, vector<int> &path, int n) {

19     if (!root) return false;

20     path.push_back(root->data);

21     if (root->data == n) return true;

22     if (root->left && findpath(root->left, path, n) || root->right && findpath(root->right, path, n)) return true;

23     path.pop_back();

24     return false;

25 }

26 

27 int LCA(node *root, int n1, int n2) {

28     if (!root) return -1;

29     vector<int> path1, path2;

30     if (!findpath(root, path1, n1) || !findpath(root, path2, n2)) return -1;

31     int i = 0;

32     for (; i < path1.size() && i < path2.size(); i++) {

33         if (path1[i] != path2[i]) break;

34     }

35     return path1[i-1];

36 }

37 

38 int main() {

39     node *root = new node(1);

40     root->left = new node(2);

41     root->right = new node(3);

42     root->left->left = new node(4);

43     root->left->right = new node(5);

44     root->right->left = new node(6);

45     root->right->right = new node(7);

46     cout << "LCA(4, 5) is " << LCA(root, 4, 5) << endl;

47     cout << "LCA(4, 6) is " << LCA(root, 4, 6) << endl;

48     cout << "LCA(3, 4) is " << LCA(root, 3, 4) << endl;

49     cout << "LCA(2, 4) is " << LCA(root, 2, 4) << endl;

50     return 0;

51 }

 one traversal

 1 #include <iostream>

 2 #include <vector>

 3 #include <algorithm>

 4 #include <queue>

 5 #include <stack>

 6 #include <string>

 7 #include <fstream>

 8 #include <map>

 9 using namespace std;

10 

11 struct node {

12     int data;

13     struct node *left, *right;

14     node() : data(0), left(NULL), right(NULL) { }

15     node(int d) : data(d), left(NULL), right(NULL) { }

16 };

17 

18 node* LCA(node *root, int n1, int n2) {

19     if (!root) return NULL;

20     if (root->data == n1 || root->data == n2) return root;

21     node *l = LCA(root->left, n1, n2);

22     node *r = LCA(root->right, n1, n2);

23     if (l && r) return root;

24     return l? l : r;

25 }

26 

27 int main() {

28     node *root = new node(1);

29     root->left = new node(2);

30     root->right = new node(3);

31     root->left->left = new node(4);

32     root->left->right = new node(5);

33     root->right->left = new node(6);

34     root->right->right = new node(7);

35     cout << "LCA(4, 5) is " << LCA(root, 4, 5)->data << endl;

36     cout << "LCA(4, 6) is " << LCA(root, 4, 6)->data << endl;

37     cout << "LCA(3, 4) is " << LCA(root, 3, 4)->data << endl;

38     cout << "LCA(2, 4) is " << LCA(root, 2, 4)->data << endl;

39     return 0;

40 }

上面这段代码有些问题,当n1或者n2不存在时应该回NULL,但是回的是n1或者n2

 1 #include <iostream>

 2 #include <vector>

 3 #include <algorithm>

 4 #include <queue>

 5 #include <stack>

 6 #include <string>

 7 #include <fstream>

 8 #include <map>

 9 using namespace std;

10 

11 struct node {

12     int data;

13     struct node *left, *right;

14     node() : data(0), left(NULL), right(NULL) { }

15     node(int d) : data(d), left(NULL), right(NULL) { }

16 };

17 

18 node* _LCA(node *root, int n1, int n2, bool &v1, bool &v2) {

19     if (!root) return NULL;

20     if (root->data == n1) {

21         v1 = true;

22         return root;

23     }

24     if (root->data == n2) {

25         v2 = true;

26         return root;

27     }

28     node *l = _LCA(root->left, n1, n2, v1, v2);

29     node *r = _LCA(root->right, n1, n2, v1, v2);

30     if (l && r) return root;

31     return l? l : r;

32 }

33 

34 bool findnode(node *root, int k) {

35     if (!root) return false;

36     return (root->data == k || findnode(root->left, k) || findnode(root->right, k));

37 }

38 

39 node *LCA(node *root, int n1, int n2) {

40     bool v1 = false;

41     bool v2 = false;

42     node *lca = _LCA(root, n1, n2, v1, v2);

43     if (v1 && v2 || v1 && findnode(root, n2) || v2 && findnode(root, n1)) return lca;

44     return NULL;

45 }

46 

47 int main() {

48     node *root = new node(1);

49     root->left = new node(2);

50     root->right = new node(3);

51     root->left->left = new node(4);

52     root->left->right = new node(5);

53     root->right->left = new node(6);

54     root->right->right = new node(7);

55     cout << "LCA(4, 5) is " << LCA(root, 4, 5)->data << endl;

56     cout << "LCA(4, 6) is " << LCA(root, 4, 6)->data << endl;

57     cout << "LCA(3, 4) is " << LCA(root, 3, 4)->data << endl;

58     cout << "LCA(2, 4) is " << LCA(root, 2, 4)->data << endl;

59     return 0;

60 }

 

你可能感兴趣的:(binary)