π One-stop destination for all your technical interview Preparation π
Given the root of a binary tree, return the zigzag level order traversal of its nodesβ values. (i.e., from left to right, then right to left for the next level and alternate between).
Prerequisites:
class Solution {
private:
void zigzagLevelOrderRec(TreeNode* root, int level, vector<vector<int>>& res)
{
if (root == NULL)
return;
if (level >= res.size()) {
res.push_back(vector<int>());
}
if (level & 1) { // odd
res[level].insert(res[level].begin(), root->val);
} else { // even
res[level].push_back(root->val);
}
zigzagLevelOrderRec(root->left, level + 1, res);
zigzagLevelOrderRec(root->right, level + 1, res);
}
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root)
{
vector<vector<int>> res;
if (root == NULL)
return res;
zigzagLevelOrderRec(root, 0, res);
return res;
}
};
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root)
{
vector<vector<int>> res;
if (root == NULL) {
return res;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int sz = q.size();
vector<int> currLevel;
for (int i = 0; i < sz; i++) {
TreeNode* node = q.front();
q.pop();
if (node->left)
q.push(node->left);
if (node->right)
q.push(node->right);
currLevel.push_back(node->val);
}
if (res.size() & 1) { // odd // only added this line
reverse(currLevel.begin(), currLevel.end());
}
res.push_back(currLevel);
}
return res;
}
};
class Solution {
public:
vector<vector<int>> zigzagLevelOrder(TreeNode* root)
{
vector<vector<int>> res;
if (root == NULL) {
return res;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int sz = q.size();
vector<int> currLevel;
bool isOdd = (res.size() & 1);
for (int i = 0; i < sz; i++) {
TreeNode* node = q.front();
q.pop();
if (node->left)
q.push(node->left);
if (node->right)
q.push(node->right);
if(isOdd)
currLevel.insert(currLevel.begin(), node->val);
else
currLevel.push_back(node->val);
}
res.push_back(currLevel);
}
return res;
}
};
vector<int> zigZagTraversal(BinaryTreeNode<int> *root)
{
vector<int> result;
if (root == NULL)
return result;
stack<BinaryTreeNode<int> *> s1;
stack<BinaryTreeNode<int> *> s2;
s1.push(root);
while (!s1.empty() || !s2.empty())
{
while (!s1.empty())
{
BinaryTreeNode<int> *temp = s1.top();
s1.pop();
result.push_back(temp->data);
if (temp->left)
s2.push(temp->left);
if (temp->right)
s2.push(temp->right);
}
while (!s2.empty())
{
BinaryTreeNode<int> *temp = s2.top();
s2.pop();
result.push_back(temp->data);
if (temp->right)
s1.push(temp->right);
if (temp->left)
s1.push(temp->left);
}
}
return result;
}