#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cstring>
#include<cassert>
#include<climits>
#include<iostream>
#include<sstream>
#include<vector>
#include<set>
#include<map>
#include<stack>
#include<queue>
#include<bitset>
#include<algorithm>
#include<iterator>
#include<string>
#include<tuple>
#include<random>
#include <chrono>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
void zigzag(TreeNode* root) {
vector<TreeNode*> pts;
if (NULL == root)
return;
queue<TreeNode*> q;
q.push(root);
int num1 = 1, num2 = 0;
TreeNode* cur = NULL;
while (!q.empty()) {
cur = q.front();
q.pop();
if (cur->left != NULL) {
q.push(cur->left);
num2++;
}
if (cur->right != NULL) {
q.push(cur->right);
num2++;
}
pts.push_back(cur);
num1--;
if (0 == num1) {
pts.push_back(NULL);
num1 = num2;
num2 = 0;
}
}
int n = pts.size();
int rev = 0;
int i, j;
i = -1;
int mid, sum;
while (i < n) {
j = i + 1;
while (j < n && pts[j] != NULL)
j++;
// reverse
if (rev) {
mid = i + (j - i) / 2;
sum = i + j;
for (int x=i+1; x<=mid; x++)
swap(pts[x], pts[sum-x]);
}
rev = !rev;
i = j;
}
for (i=0; i<n; i++)
if (pts[i] != NULL)
printf(" %d ", pts[i]->val);
}
int main() {
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->right->left = new TreeNode(5);
root->right->right = new TreeNode(6);
zigzag(root);
return 0;
}
用普通的队列加标记即可实现。