@@ -122,6 +122,72 @@ void connect1(TreeLinkNode *root) {
122122 v.pop_back ();
123123 }
124124}
125+
126+ void connect3 (TreeLinkNode *root) {
127+ if (root == NULL ) return ;
128+
129+ queue<TreeLinkNode*> q;
130+ TreeLinkNode *prev, *last;
131+ prev = last = root;
132+
133+ q.push (root);
134+ while (!q.empty ()) {
135+ TreeLinkNode* p = q.front ();
136+ q.pop ();
137+
138+ prev->next = p;
139+ if (p->left ) q.push (p->left );
140+ if (p->right ) q.push (p->right );
141+
142+ if (p == last) { // meets last of current level
143+ // now, q contains all nodes of next level
144+ last = q.back ();
145+ p->next = NULL ; // cut down.
146+ prev = q.front ();
147+ }
148+ else {
149+ prev = p;
150+ }
151+ }
152+ }
153+
154+ // constant space
155+ // key point: we can use `next` pointer to represent
156+ // the buffering queue of level order traversal.
157+ void connect4 (TreeLinkNode *root) {
158+ if (root == NULL ) return ;
159+
160+ TreeLinkNode *head, *tail;
161+ TreeLinkNode *prev, *last;
162+
163+ head = tail = NULL ;
164+ prev = last = root;
165+
166+ #define push (p ) \
167+ if (head == NULL ) { head = tail = p; } \
168+ else { tail->next = p; tail = p; }
169+
170+ push (root);
171+ while (head != NULL ) {
172+ TreeLinkNode* p = head;
173+ head = head->next ; // pop
174+
175+ prev->next = p;
176+ if (p->left ) push (p->left );
177+ if (p->right ) push (p->right );
178+
179+ if (p == last) {
180+ last = tail;
181+ p->next = NULL ; // cut down.
182+ prev = head;
183+ }
184+ else {
185+ prev = p;
186+ }
187+ }
188+ #undef push
189+ }
190+
125191void printTree (TreeLinkNode *root){
126192 if (root == NULL ){
127193 return ;
0 commit comments