Data Structure Binary Tree: Connect nodes at same level using constant extra space

http://www.geeksforgeeks.org/connect-nodes-at-same-level-with-o1-extra-space/

recursive:

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <queue>
 5 #include <stack>
 6 #include <string>
 7 #include <fstream>
 8 using namespace std;
 9 
10 struct node {
11     int data;
12     struct node *left, *right, *next;
13     node() : data(0), left(NULL), right(NULL), next(NULL) { }
14     node(int d) : data(d), left(NULL), right(NULL), next(NULL) { }
15 };
16 
17 node *getnext(node *root) {
18     node *next = root->next;
19     while (next) {
20         if (next->left) return next->left;
21         if (next->right) return next->right;
22         next = next->next;
23     }
24     return NULL;
25 }
26 
27 void _connect(node *root) {
28     if (!root) return;
29     if (root->next) _connect(root->next);
30     if (root->left) {
31         if (root->right) {
32             root->left->next = root->right;
33             root->right->next = getnext(root);
34         }
35         else root->left->next = getnext(root);
36         _connect(root->left);
37     }
38     else if (root->right) {
39         root->right->next = getnext(root);
40         _connect(root->right);
41     }
42     else _connect(root->next);
43 }
44 
45 void connect(node *root) {
46     if (!root) return;
47     root->next = NULL;
48     _connect(root);
49 }
50 
51 int main() {
52     node *root = new node(10);
53     root->left = new node(8);
54     root->right = new node(2);
55     root->left->left = new node(3);
56     root->right->right = new node(90);
57     connect(root);
58     cout << root->data << "->" << (root->next? root->next->data : -1) << endl;
59     cout << root->left->data << "->" << (root->left->next? root->left->next->data : -1) << endl;
60     cout << root->right->data << "->" << (root->right->next? root->right->next->data : -1) << endl;
61     cout << root->left->left->data << "->" << (root->left->left->next? root->left->left->next->data : -1) << endl;
62     cout << root->right->right->data << "->" << (root->right->right->next? root->right->right->next->data : -1) << endl;
63     return 0;
64 }

iterative(better)

 1 #include <iostream>
 2 #include <vector>
 3 #include <algorithm>
 4 #include <queue>
 5 #include <stack>
 6 #include <string>
 7 #include <fstream>
 8 using namespace std;
 9 
10 struct node {
11     int data;
12     struct node *left, *right, *next;
13     node() : data(0), left(NULL), right(NULL), next(NULL) { }
14     node(int d) : data(d), left(NULL), right(NULL), next(NULL) { }
15 };
16 
17 node *getnext(node *root) {
18     node *next = root->next;
19     while (next) {
20         if (next->left) return next->left;
21         if (next->right) return next->right;
22         next = next->next;
23     }
24     return NULL;
25 }
26 
27 void connect(node *root) {
28     if (!root) return;
29     root->next = NULL;
30     while (root) {
31         node *p = root;
32         while (p) {
33             if (p->left) {
34                 if (p->right) p->left->next = p->right;
35                 else p->left->next = getnext(p);
36             }
37             if (p->right) p->right->next = getnext(p);
38             p = p->next;
39         }
40         if (root->left) root = root->left;
41         else if (root->right) root = root->right;
42         else root = root->next;
43     }
44 }
45 
46 int main() {
47     node *root = new node(10);
48     root->left = new node(8);
49     root->right = new node(2);
50     root->left->left = new node(3);
51     root->right->right = new node(90);
52     connect(root);
53     cout << root->data << "->" << (root->next? root->next->data : -1) << endl;
54     cout << root->left->data << "->" << (root->left->next? root->left->next->data : -1) << endl;
55     cout << root->right->data << "->" << (root->right->next? root->right->next->data : -1) << endl;
56     cout << root->left->left->data << "->" << (root->left->left->next? root->left->left->next->data : -1) << endl;
57     cout << root->right->right->data << "->" << (root->right->right->next? root->right->right->next->data : -1) << endl;
58     return 0;
59 }
原文地址:https://www.cnblogs.com/yingzhongwen/p/3632068.html