struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> result;
if (!root) return result;
deque<TreeNode*> dq;
dq.push_back(root);
bool leftToRight = true;
while (!dq.empty()) {
int size = dq.size();
vector<int> level(size);
for (int i = 0; i < size; ++i) {
TreeNode* node = dq.front();
dq.pop_front();
int index = leftToRight ? i : (size - 1 - i);
level[index] = node->val;
if (node->left) dq.push_back(node->left);
if (node->right) dq.push_back(node->right);
}
leftToRight = !leftToRight;
result.push_back(level);
}
return result;
}
int main() {
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
root->right->right = new TreeNode(6);
vector<vector<int>> res = zigzagLevelOrder(root);
for (auto& level : res) {
for (int val : level) cout << val << " ";
cout << "\n";
}
return 0;
}The traversal starts left to right at level 0, so output is [1].
At level 1, the order is right to left, so nodes 3 and 2 are reversed to [3, 2].
At level 2, order is left to right again, so nodes 4, 5, 6 are in normal order.
Zigzag traversal requires visiting nodes from left to right on one level and right to left on the next.
A deque allows adding and removing nodes from both ends, making it easy to switch traversal direction without extra reversing steps.
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
vector<vector<int>> result;
if (!root) return result;
deque<TreeNode*> dq;
dq.push_back(root);
bool leftToRight = true;
while (!dq.empty()) {
int size = dq.size();
vector<int> level(size);
for (int i = 0; i < size; ++i) {
TreeNode* node = dq.front();
dq.pop_front();
int index = leftToRight ? i : (size - 1 - i);
level[index] = node->val;
if (node->left) dq.push_back(node->left);
if (node->right) dq.push_back(node->right);
}
leftToRight = !leftToRight;
result.push_back(level);
}
return result;
}
int main() {
TreeNode* root = new TreeNode(10);
root->left = new TreeNode(20);
root->right = new TreeNode(30);
root->left->right = new TreeNode(40);
root->right->left = new TreeNode(50);
vector<vector<int>> res = zigzagLevelOrder(root);
for (auto& level : res) {
for (int val : level) cout << val << " ";
cout << "\n";
}
return 0;
}Level 0: left to right → [10]
Level 1: right to left → [30, 20]
Level 2: left to right → children 40 and 50 in order [40, 50]
vector<vector<int>> zigzagLevelOrder(TreeNode* root) { vector<vector<int>> result; if (!root) return result; deque<TreeNode*> dq; dq.push_back(root); bool leftToRight = true; while (!dq.empty()) { int size = dq.size(); vector<int> level(size); for (int i = 0; i < size; ++i) { TreeNode* node = dq.back(); dq.pop_back(); int index = leftToRight ? i : (size - 1 - i); level[index] = node->val; if (node->left) dq.push_front(node->left); if (node->right) dq.push_front(node->right); } leftToRight = !leftToRight; result.push_back(level); } return result; }
The code removes nodes from the back but adds children to the front in the same loop, causing the deque size to never reduce properly.
This leads to an infinite loop.
A perfect binary tree of height 3 has 2^(3+1) - 1 = 15 nodes.
Zigzag traversal visits every node exactly once, so total processed nodes = 15.