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 }
原文地址:https://www.cnblogs.com/yingzhongwen/p/3632679.html