Open In App

ZigZag Tree Traversal of a Binary Tree

Last Updated : 08 Oct, 2025
Comments
Improve
Suggest changes
99 Likes
Like
Report

Given the root of a binary tree, perform a zigzag (spiral) level order traversal. For odd-numbered levels, traverse the nodes from left to right and for even-numbered levels, traverse the nodes from right to left.

Examples:

Input:

420046822


Output: [20, 22, 8, 4, 12, 11, 14, 10]
Explanation:

420046823


[Naive Approach] - Using Recursion

The idea is to first calculate the height of the tree, and then recursively traverse each level to perform a level order traversal according to the current level’s direction.

The traversal alternates directions at each level to achieve a zigzag pattern:

  • At the first level, nodes are visited from left to right.
  • At the next level, nodes are visited from right to left.
  • This pattern continues for all levels by flipping the direction after each level.
C++
#include <vector>
#include <iostream>

using namespace std;

// Node Structure
class Node {
    public:
        int data;
        Node *left;
        Node *right;
        Node(int x) {
            data = x;
            left = nullptr;
            right = nullptr;
        }
};

// Finding the Tree Height
int treeHeight(Node *root){
    if(!root) return 0;
    int lHeight = treeHeight(root->left);
    int rHeight = treeHeight(root->right);
    return max(lHeight, rHeight) + 1;
}

// Function which prints from left to 
// right traversal at a certain level
void leftToRightTrav(Node* root, int level, vector<int>&res) {
    if (root == nullptr) return;
    
    if (level == 1) {
        res.push_back(root->data);
    }
    else {
        leftToRightTrav(root->left, level-1, res);
        leftToRightTrav(root->right, level-1, res);
    }
}

// Function which prints from right to 
// left traversal at a certain level
void rightToLeftTrav(Node* root, int level, vector<int>&res) {
    if (root == nullptr) return;
    
    if (level == 1) {
        res.push_back(root->data);
    }
    else {
        rightToLeftTrav(root->right, level-1, res);
        rightToLeftTrav(root->left, level-1, res);
    }
}

vector<int> zigZagTraversal(Node* root) {
    vector<int> res;
    bool leftToRight = true;
    int height = treeHeight(root);
    
    for(int i = 1; i <= height; i++){
        if (leftToRight)
            leftToRightTrav(root, i, res);
        else 
            rightToLeftTrav(root, i, res);
            
        // Flip the value of leftToRight
        leftToRight = !leftToRight;
    }
    
    return res;
}

int main() {

    // Create a input binary tree
    //         20
    //       /   \
    //      8     22
    //    /  \     \
    //   4   12    11
    //      /  \
    //     10   14
    Node* root = new Node(20);
    root->left = new Node(8);
    root->right = new Node(22);
    root->right->right = new Node(11);
    root->left->left = new Node(4);
    root->left->right = new Node(12);
    root->left->right->left = new Node(10);
    root->left->right->right = new Node(14);
    
    vector<int> res = zigZagTraversal(root);
    for (int i=0; i<res.size(); i++) {
        cout << res[i] << " ";
    }

    return 0;
}
C
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

// Node Structure
struct Node {
    int data;
    struct Node* left;
    struct Node* right;
};

// Finding the Tree Height
int treeHeight(struct Node* root) {
    if (root == NULL) return 0;
    int lHeight = treeHeight(root->left);
    int rHeight = treeHeight(root->right);
    return (lHeight > rHeight ? lHeight : rHeight) + 1;
}

// Function to traverse from left to right traversal at a certain level
void leftToRightTrav(struct Node* root, int level, int* res, int* index) {
    if (root == NULL) return;

    if (level == 1) {
        res[(*index)++] = root->data;
    } else {
        leftToRightTrav(root->left, level - 1, res, index);
        leftToRightTrav(root->right, level - 1, res, index);
    }
}

// Function to traverse from right to left traversal at a certain level
void rightToLeftTrav(struct Node* root, int level, int* res, int* index) {
    if (root == NULL) return;

    if (level == 1) {
        res[(*index)++] = root->data;
    } else {
        rightToLeftTrav(root->right, level - 1, res, index);
        rightToLeftTrav(root->left, level - 1, res, index);
    }
}

// Function to traverse the tree in zigzag order
void zigZagTraversal(struct Node* root, int* res, int* size) {
    bool leftToRight = true;
    int height = treeHeight(root);
    int index = 0;

    for (int i = 1; i <= height; i++) {
        if (leftToRight)
            leftToRightTrav(root, i, res, &index);
        else
            rightToLeftTrav(root, i, res, &index);

        leftToRight = !leftToRight;
    }
  
  	// Set the size of the result
    *size = index; 
}

struct Node* createNode(int val) {
    struct Node* node = 
      (struct Node*)malloc(sizeof(struct Node));
    node->data = val;
    node->left = node->right = NULL;
    return node;
}

int main() {
  
    // Create a input binary tree
    //         20
    //       /   \
    //      8     22
    //    /  \     \
    //   4   12    11
    //      /  \
    //     10   14
    struct Node* root = createNode(20);
    root->left = createNode(8);
    root->right = createNode(22);
    root->right->right = createNode(11);
    root->left->left = createNode(4);
    root->left->right = createNode(12);
    root->left->right->left = createNode(10);
    root->left->right->right = createNode(14);
	
  	// Array to hold zigzag traversal results
    int res[200]; 
    int size = 0;

    zigZagTraversal(root, res, &size);

    for (int i = 0; i < size; i++) {
        printf("%d ", res[i]);
    }
    printf("\n");

    return 0;
}
Java
import java.util.ArrayList;
import java.util.List;

// Node Structure
class Node {
    int data;
    Node left, right;

    Node(int x) {
        data = x;
        left = right = null;
    }
}

class GFG {
    
    // Finding the Tree Height
    static int treeHeight(Node root) {
        if (root == null) return 0;
        int lHeight = treeHeight(root.left);
        int rHeight = treeHeight(root.right);
        return Math.max(lHeight, rHeight) + 1;
    }
    
    // Function which prints from left to 
    // right traversal at a certain level
    static void leftToRightTrav(Node root, int level, ArrayList<Integer> res) {
        if (root == null) return;
        
        if (level == 1) {
            res.add(root.data);
        } else {
            leftToRightTrav(root.left, level - 1, res);
            leftToRightTrav(root.right, level - 1, res);
        }
    }
    
    // Function which prints from right to 
    // left traversal at a certain level
    static void rightToLeftTrav(Node root, int level, ArrayList<Integer> res) {
        if (root == null) return;
        
        if (level == 1) {
            res.add(root.data);
        } else {
            rightToLeftTrav(root.right, level - 1, res);
            rightToLeftTrav(root.left, level - 1, res);
        }
    }
    
    // Finding the zigZagTraversal
    static ArrayList<Integer> zigZagTraversal(Node root) {
        ArrayList<Integer> res = new ArrayList<>();
        boolean leftToRight = true;
        int height = treeHeight(root);
        
        for (int i = 1; i <= height; i++) {
            if (leftToRight)
                leftToRightTrav(root, i, res);
            else
                rightToLeftTrav(root, i, res);
                
            // Flip the value of leftToRight
            leftToRight = !leftToRight;
        }
        
        return res;
    }

    public static void main(String[] args) {
        
        // Create a input binary tree
        //         20
        //       /   \
        //      8     22
        //    /  \     \
        //   4   12    11
        //      /  \
        //     10   14
        Node root = new Node(20);
        root.left = new Node(8);
        root.right = new Node(22);
        root.right.right = new Node(11);
        root.left.left = new Node(4);
        root.left.right = new Node(12);
        root.left.right.left = new Node(10);
        root.left.right.right = new Node(14);
        
        ArrayList<Integer> res = zigZagTraversal(root);
        for (int i : res) {
            System.out.print(i + " ");
        }
        System.out.println();
    }
}
Python
# Node Structure
class Node:
    def __init__(self, x):
        self.data = x
        self.left = None
        self.right = None

# Finding the Tree Height
def treeHeight(root):
    if root is None:
        return 0
    lHeight = treeHeight(root.left)
    rHeight = treeHeight(root.right)
    return max(lHeight, rHeight) + 1

# Function which prints from left to 
# right traversal at a certain level
def leftToRightTrav(root, level, res):
    if root is None:
        return
    
    if level == 1:
        res.append(root.data)
    else:
        leftToRightTrav(root.left, level - 1, res)
        leftToRightTrav(root.right, level - 1, res)

# Function which prints from right to 
# left traversal at a certain level
def rightToLeftTrav(root, level, res):
    if root is None:
        return
    
    if level == 1:
        res.append(root.data)
    else:
        rightToLeftTrav(root.right, level - 1, res)
        rightToLeftTrav(root.left, level - 1, res)
    
# Finding the zigZagTraversal
def zigZagTraversal(root):
    res = []
    leftToRight = True
    height = treeHeight(root)
    
    for i in range(1, height + 1):
        if leftToRight:
            leftToRightTrav(root, i, res)
        else:
            rightToLeftTrav(root, i, res)
            
        # Flip the value of leftToRight
        leftToRight = not leftToRight
    
    return res

if __name__ == "__main__":
    
    # Create a input binary tree
    #         20
    #       /   \
    #      8     22
    #    /  \     \
    #   4   12    11
    #      /  \
    #     10   14
    root = Node(20)
    root.left = Node(8)
    root.right = Node(22)
    root.right.right = Node(11)
    root.left.left = Node(4)
    root.left.right = Node(12)
    root.left.right.left = Node(10)
    root.left.right.right = Node(14)
    
    res = zigZagTraversal(root)
    for i in res:
        print(i, end=" ")
    print()
C#
using System;
using System.Collections.Generic;

// Node Structure
class Node {
    public int data;
    public Node left, right;

    public Node(int x) {
        data = x;
        left = right = null;
    }
}

class GFG {
    
    // Finding the Tree Height
    static int treeHeight(Node root) {
        if (root == null) return 0;
        int lHeight = treeHeight(root.left);
        int rHeight = treeHeight(root.right);
        return Math.Max(lHeight, rHeight) + 1;
    }
    
    // Function which prints from left to 
    // right traversal at a certain level
    static void leftToRightTrav(Node root, int level, List<int> res) {
        if (root == null) return;
        
        if (level == 1) {
            res.Add(root.data);
        } else {
            leftToRightTrav(root.left, level - 1, res);
            leftToRightTrav(root.right, level - 1, res);
        }
    }
    
    // Function which prints from right to 
    // left traversal at a certain level
    static void rightToLeftTrav(Node root, int level, List<int> res) {
        if (root == null) return;
        
        if (level == 1) {
            res.Add(root.data);
        } else {
            rightToLeftTrav(root.right, level - 1, res);
            rightToLeftTrav(root.left, level - 1, res);
        }
    }
        
    // Finding the zigZagTraversal
    static List<int> zigZagTraversal(Node root) {
        List<int> res = new List<int>();
        bool leftToRight = true;
        int height = treeHeight(root);
        
        for (int i = 1; i <= height; i++) {
            if (leftToRight)
                leftToRightTrav(root, i, res);
            else
                rightToLeftTrav(root, i, res);
                
            // Flip the value of leftToRight
            leftToRight = !leftToRight;
        }
        
        return res;
    }

    static void Main() {

        // Create a input binary tree
        //         20
        //       /   \
        //      8     22
        //    /  \     \
        //   4   12    11
        //      /  \
        //     10   14
        Node root = new Node(20);
        root.left = new Node(8);
        root.right = new Node(22);
        root.right.right = new Node(11);
        root.left.left = new Node(4);
        root.left.right = new Node(12);
        root.left.right.left = new Node(10);
        root.left.right.right = new Node(14);
        
        List<int> res = zigZagTraversal(root);
        foreach (int i in res) {
            Console.Write(i + " ");
        }
        Console.WriteLine();
    }
}
JavaScript
// Node Structure
class Node {
    constructor(x) {
        this.data = x;
        this.left = null;
        this.right = null;
    }
}

// Finding the Tree Height
function treeHeight(root) {
    if (root === null) return 0;
    let lHeight = treeHeight(root.left);
    let rHeight = treeHeight(root.right);
    return Math.max(lHeight, rHeight) + 1;
}

// Function which prints from left to 
// right traversal at a certain level
function leftToRightTrav(root, level, res) {
    if (root === null) return;
    
    if (level === 1) {
        res.push(root.data);
    } else {
        leftToRightTrav(root.left, level - 1, res);
        leftToRightTrav(root.right, level - 1, res);
    }
}

// Function which prints from right to 
// left traversal at a certain level
function rightToLeftTrav(root, level, res) {
    if (root === null) return;
    
    if (level === 1) {
        res.push(root.data);
    } else {
        rightToLeftTrav(root.right, level - 1, res);
        rightToLeftTrav(root.left, level - 1, res);
    }
}

function zigZagTraversal(root) {
    let res = [];
    let leftToRight = true;
    let height = treeHeight(root);
    
    for (let i = 1; i <= height; i++) {
        if (leftToRight) {
            leftToRightTrav(root, i, res);
        } else {
            rightToLeftTrav(root, i, res);
        }
        
        // Flip the value of leftToRight
        leftToRight = !leftToRight;
    }
    
    return res;
}

// Driver code

// Create a input binary tree
//         20
//       /   \
//      8     22
//    /  \     \
//   4   12    11
//      /  \
//     10   14
let root = new Node(20);
root.left = new Node(8);
root.right = new Node(22);
root.right.right = new Node(11);
root.left.left = new Node(4);
root.left.right = new Node(12);
root.left.right.left = new Node(10);
root.left.right.right = new Node(14);

let res = zigZagTraversal(root);
res.forEach(i => console.log(i));

Output
20 22 8 4 12 11 14 10 

Time Complexity: O(n*h), where n is the number of nodes and h is the height of the tree. For each height from 1 to n, we are recursively traversing the tree from root in order to get nodes at a certain height.
Auxiliary Space: O(h)

[Expected Approach - 1] - Using Two Stacks - O(n) Time and O(n) Space

The idea is to perform a zigzag (spiral) level order traversal of a binary tree using two stacks instead of recursion.

  • s1 stores nodes of the current level, and s2 stores nodes of the next level.
  • Nodes in s1 are processed from top to bottom, and their children are pushed onto s2 in left → right order.
  • Nodes in s2 are then processed from top to bottom, and their children are pushed onto s1 in right → left order.
  • By alternating the order of pushing children between the two stacks at each level, the traversal naturally alternates direction, achieving the zigzag pattern.
C++
#include <iostream>
#include <vector>

using namespace std;

// Node Structure
class Node {
public:
    int data;
    Node *left;
    Node *right;
    Node(int x) {
        data = x;
        left = nullptr;
        right = nullptr;
    }
};

vector<int> zigZagTraversal(Node* root) {
    vector<int> res;
    if (root == nullptr)
        return res;
    
    // Current level
    stack<Node*> s1; 
    
    // Next level
    stack<Node*> s2; 

    s1.push(root);

    while (!s1.empty() || !s2.empty()) {

        // Print nodes of current level from s1
        // and push nodes of next level to s2
        while (!s1.empty()) {
            Node* curr = s1.top();
            s1.pop();
            res.push_back(curr->data);
            
            if (curr->left)
                s2.push(curr->left);
            if (curr->right)
                s2.push(curr->right);
            
        }

        // Print nodes of current level from s2
        // and push nodes of next level to s1
        while (!s2.empty()) {
            Node* curr = s2.top();
            s2.pop();
            res.push_back(curr->data);
            
            if (curr->right)
                s1.push(curr->right);
            if (curr->left)
                s1.push(curr->left);
        }
    }
    return res;
}

int main() {

    // Create a input binary tree
    //         20
    //       /   \
    //      8     22
    //    /  \     \
    //   4   12    11
    //      /  \
    //     10   14
    Node* root = new Node(20);
    root->left = new Node(8);
    root->right = new Node(22);
    root->right->right = new Node(11);
    root->left->left = new Node(4);
    root->left->right = new Node(12);
    root->left->right->left = new Node(10);
    root->left->right->right = new Node(14);
    
    vector<int> res = zigZagTraversal(root);
    for (auto val: res) cout << val << " ";
    cout << endl;

    return 0;
}
Java
import java.util.ArrayList;
import java.util.List;

// Node Structure
class Node {
    int data;
    Node left;
    Node right;
    Node(int x) {
        data = x;
        left = null;
        right = null;
    }
}

class GFG {
    
    static ArrayList<Integer> zigZagTraversal(Node root) {
        ArrayList<Integer> res = new ArrayList<>();
        if (root == null)
            return res;
        
        // Current level
        Stack<Node> s1 = new Stack<>(); 
        
        // Next level
        Stack<Node> s2 = new Stack<>(); 

        s1.push(root);

        while (!s1.empty() || !s2.empty()) {

            // Print nodes of current level from s1
            // and push nodes of next level to s2
            while (!s1.empty()) {
                Node curr = s1.pop();
                res.add(curr.data);
                
                if (curr.left != null)
                    s2.push(curr.left);
                if (curr.right != null)
                    s2.push(curr.right);
            }

            // Print nodes of current level from s2
            // and push nodes of next level to s1
            while (!s2.empty()) {
                Node curr = s2.pop();
                res.add(curr.data);
                
                if (curr.right != null)
                    s1.push(curr.right);
                if (curr.left != null)
                    s1.push(curr.left);
            }
        }
        return res;
    }

    public static void main(String[] args) {
        
        // Create a input binary tree
        //         20
        //       /   \
        //      8     22
        //    /  \     \
        //   4   12    11
        //      /  \
        //     10   14
        Node root = new Node(20);
        root.left = new Node(8);
        root.right = new Node(22);
        root.right.right = new Node(11);
        root.left.left = new Node(4);
        root.left.right = new Node(12);
        root.left.right.left = new Node(10);
        root.left.right.right = new Node(14);
        
        ArrayList<Integer> res = zigZagTraversal(root);
        for (int val : res) System.out.print(val + " ");
        System.out.println();
    }
}
Python
# Node Structure
class Node:
    def __init__(self, x):
        self.data = x
        self.left = None
        self.right = None

def zigZagTraversal(root):
    res = []
    if root is None:
        return res
    
    # Current level
    s1 = []
    
    # Next level
    s2 = []

    s1.append(root)

    while s1 or s2:

        # Print nodes of current level from s1
        # and push nodes of next level to s2
        while s1:
            curr = s1.pop()
            res.append(curr.data)
            
            if curr.left:
                s2.append(curr.left)
            if curr.right:
                s2.append(curr.right)

        # Print nodes of current level from s2
        # and push nodes of next level to s1
        while s2:
            curr = s2.pop()
            res.append(curr.data)
            
            if curr.right:
                s1.append(curr.right)
            if curr.left:
                s1.append(curr.left)
    return res

if __name__ == "__main__":
    
    # Create a input binary tree
    #         20
    #       /   \
    #      8     22
    #    /  \     \
    #   4   12    11
    #      /  \
    #     10   14
    root = Node(20)
    root.left = Node(8)
    root.right = Node(22)
    root.right.right = Node(11)
    root.left.left = Node(4)
    root.left.right = Node(12)
    root.left.right.left = Node(10)
    root.left.right.right = Node(14)
    
    res = zigZagTraversal(root)
    for val in res: print(val, end=" ")
    print()
C#
using System;
using System.Collections.Generic;

// Node Structure
class Node {
    public int data;
    public Node left;
    public Node right;
    public Node(int x) {
        data = x;
        left = null;
        right = null;
    }
}

class GFG {
    
    static List<int> zigZagTraversal(Node root) {
        List<int> res = new List<int>();
        if (root == null)
            return res;
        
        // Current level
        Stack<Node> s1 = new Stack<Node>(); 
        
        // Next level
        Stack<Node> s2 = new Stack<Node>(); 

        s1.Push(root);

        while (s1.Count > 0 || s2.Count > 0) {

            // Print nodes of current level from s1
            // and push nodes of next level to s2
            while (s1.Count > 0) {
                Node curr = s1.Pop();
                res.Add(curr.data);
                
                if (curr.left != null)
                    s2.Push(curr.left);
                if (curr.right != null)
                    s2.Push(curr.right);
            }

            // Print nodes of current level from s2
            // and push nodes of next level to s1
            while (s2.Count > 0) {
                Node curr = s2.Pop();
                res.Add(curr.data);
                
                if (curr.right != null)
                    s1.Push(curr.right);
                if (curr.left != null)
                    s1.Push(curr.left);
            }
        }
        return res;
    }

    static void Main() {
        
        // Create a input binary tree
        //         20
        //       /   \
        //      8     22
        //    /  \     \
        //   4   12    11
        //      /  \
        //     10   14
        Node root = new Node(20);
        root.left = new Node(8);
        root.right = new Node(22);
        root.right.right = new Node(11);
        root.left.left = new Node(4);
        root.left.right = new Node(12);
        root.left.right.left = new Node(10);
        root.left.right.right = new Node(14);
        
        List<int> res = zigZagTraversal(root);
        foreach (int val in res) Console.Write(val + " ");
        Console.WriteLine();
    }
}
JavaScript
// Node Structure
class Node {
    constructor(x) {
        this.data = x;
        this.left = null;
        this.right = null;
    }
}

function zigZagTraversal(root) {
    let res = [];
    if (root == null)
        return res;
    
    // Current level
    let s1 = []; 
    
    // Next level
    let s2 = []; 

    s1.push(root);

    while (s1.length > 0 || s2.length > 0) {

        // Print nodes of current level from s1
        // and push nodes of next level to s2
        while (s1.length > 0) {
            let curr = s1.pop();
            res.push(curr.data);
            
            if (curr.left)
                s2.push(curr.left);
            if (curr.right)
                s2.push(curr.right);
        }

        // Print nodes of current level from s2
        // and push nodes of next level to s1
        while (s2.length > 0) {
            let curr = s2.pop();
            res.push(curr.data);
            
            if (curr.right)
                s1.push(curr.right);
            if (curr.left)
                s1.push(curr.left);
        }
    }
    return res;
}

// Driver code

// Create a input binary tree
//         20
//       /   \
//      8     22
//    /  \     \
//   4   12    11
//      /  \
//     10   14
let root = new Node(20);
root.left = new Node(8);
root.right = new Node(22);
root.right.right = new Node(11);
root.left.left = new Node(4);
root.left.right = new Node(12);
root.left.right.left = new Node(10);
root.left.right.right = new Node(14);

let res = zigZagTraversal(root);
console.log(res.join(" "));

Output
20 22 8 4 12 11 14 10 

[Expected Approach - 2] - Using Deque - O(n) Time and O(n) Space

The idea is to use a deque to store nodes level by level and alternate the direction of traversal at each level.

  • For a level traversed left to right, nodes are popped from the front, and their children are added to the back in left → right order.
  • For a level traversed right to left, nodes are popped from the back, and their children are added to the front in right → left order.
C++
#include <iostream>
#include <vector>

// Node Structure
class Node {
public:
    int data;
    Node *left;
    Node *right;
    Node(int x) {
        data = x;
        left = nullptr;
        right = nullptr;
    }
};

vector<int> zigZagTraversal(Node* root) {
    vector<int> res;
    if (!root) return res;

    deque<Node*> dq;
    dq.push_back(root);

    bool reverse = false;

    while (!dq.empty()) {
        int n = dq.size();

        while (n--) {
            
            // Push right to the front 
            // first if reverse is true
            if (reverse) {
                Node* curr = dq.back();
                dq.pop_back();
                res.push_back(curr->data);

                if (curr->right) dq.push_front(curr->right);
                if (curr->left)  dq.push_front(curr->left);
            }
            
            // Else push left to the back first
            else {
                Node* curr = dq.front();
                dq.pop_front();
                res.push_back(curr->data);

                if (curr->left)  dq.push_back(curr->left);
                if (curr->right) dq.push_back(curr->right);
            }
        }

        reverse = !reverse;
    }

    return res;
}

int main() {

    // Create a input binary tree
    //         20
    //       /   \
    //      8     22
    //    /  \     \
    //   4   12    11
    //      /  \
    //     10   14
    Node* root = new Node(20);
    root->left = new Node(8);
    root->right = new Node(22);
    root->right->right = new Node(11);
    root->left->left = new Node(4);
    root->left->right = new Node(12);
    root->left->right->left = new Node(10);
    root->left->right->right = new Node(14);
    
    vector<int> res = zigZagTraversal(root);
    for (auto val: res) cout << val << " ";
    cout << endl;

    return 0;
}
Java
import java.util.ArrayList;
import java.util.List;

// Node Structure
class Node {
    int data;
    Node left;
    Node right;
    Node(int x) {
        data = x;
        left = null;
        right = null;
    }
}

class GFG {
    
    static ArrayList<Integer> zigZagTraversal(Node root) {
        ArrayList<Integer> res = new ArrayList<>();
        if (root == null) return res;

        Deque<Node> dq = new LinkedList<>();
        dq.addLast(root);

        boolean reverse = false;

        while (!dq.isEmpty()) {
            int n = dq.size();

            while (n-- > 0) {
                
                // Push right to the front 
                // first if reverse is true
                if (reverse) {
                    Node curr = dq.removeLast();
                    res.add(curr.data);

                    if (curr.right != null) dq.addFirst(curr.right);
                    if (curr.left != null)  dq.addFirst(curr.left);
                }
                
                // Else push left to the back first
                else {
                    Node curr = dq.removeFirst();
                    res.add(curr.data);

                    if (curr.left != null)  dq.addLast(curr.left);
                    if (curr.right != null) dq.addLast(curr.right);
                }
            }

            reverse = !reverse;
        }

        return res;
    }

    public static void main(String[] args) {
        
        // Create a input binary tree
        //         20
        //       /   \
        //      8     22
        //    /  \     \
        //   4   12    11
        //      /  \
        //     10   14
        Node root = new Node(20);
        root.left = new Node(8);
        root.right = new Node(22);
        root.right.right = new Node(11);
        root.left.left = new Node(4);
        root.left.right = new Node(12);
        root.left.right.left = new Node(10);
        root.left.right.right = new Node(14);
        
        ArrayList<Integer> res = zigZagTraversal(root);
        for (int val : res) System.out.print(val + " ");
        System.out.println();
    }
}
Python
from collections import deque

# Node Structure
class Node:
    def __init__(self, x):
        self.data = x
        self.left = None
        self.right = None

def zigZagTraversal(root):
    res = []
    if not root:
        return res
        
    dq = deque()
    dq.append(root)
    reverse = False
        
    while dq:
        n = len(dq)
            
        for _ in range(n):
            
            # Push right to the front 
            # first if reverse is true
            if reverse:
                    
                curr = dq.pop()  
                res.append(curr.data)
                    
                if curr.right:
                    dq.appendleft(curr.right)
                if curr.left:
                    dq.appendleft(curr.left)
            
            # Else push left to the back first
            else:
                curr = dq.popleft()  
                res.append(curr.data)
                    
                if curr.left:
                    dq.append(curr.left)
                if curr.right:
                    dq.append(curr.right)
            
        reverse = not reverse
        
    return res
        
if __name__ == "__main__":
    
    # Create a input binary tree
    #         20
    #       /   \
    #      8     22
    #    /  \     \
    #   4   12    11
    #      /  \
    #     10   14
    root = Node(20)
    root.left = Node(8)
    root.right = Node(22)
    root.right.right = Node(11)
    root.left.left = Node(4)
    root.left.right = Node(12)
    root.left.right.left = Node(10)
    root.left.right.right = Node(14)
    
    res = zigZagTraversal(root)
    for val in res: print(val, end=" ")
    print()
C#
using System;
using System.Collections.Generic;

// Node Structure
class Node {
    public int data;
    public Node left;
    public Node right;
    public Node(int x) {
        data = x;
        left = null;
        right = null;
    }
}

class GFG {
    
    static List<int> zigZagTraversal(Node root) {
        List<int> res = new List<int>();
        if (root == null) return res;

        LinkedList<Node> dq = new LinkedList<Node>();
        dq.AddLast(root);

        bool reverse = false;

        while (dq.Count > 0) {
            int n = dq.Count;

            while (n-- > 0) {
                
                // Push right to the front 
                // first if reverse is true
                if (reverse) {
                    Node curr = dq.Last.Value;
                    dq.RemoveLast();
                    res.Add(curr.data);

                    if (curr.right != null) dq.AddFirst(curr.right);
                    if (curr.left != null)  dq.AddFirst(curr.left);
                }
                
                // Else push left to the back first
                else {
                    Node curr = dq.First.Value;
                    dq.RemoveFirst();
                    res.Add(curr.data);

                    if (curr.left != null)  dq.AddLast(curr.left);
                    if (curr.right != null) dq.AddLast(curr.right);
                }
            }

            reverse = !reverse;
        }

        return res;
    }

    static void Main() {
        
        // Create a input binary tree
        //         20
        //       /   \
        //      8     22
        //    /  \     \
        //   4   12    11
        //      /  \
        //     10   14
        Node root = new Node(20);
        root.left = new Node(8);
        root.right = new Node(22);
        root.right.right = new Node(11);
        root.left.left = new Node(4);
        root.left.right = new Node(12);
        root.left.right.left = new Node(10);
        root.left.right.right = new Node(14);
        
        List<int> res = zigZagTraversal(root);
        foreach (int val in res) Console.Write(val + " ");
        Console.WriteLine();
    }
}
JavaScript
// Node Structure
class Node {
    constructor(x) {
        this.data = x;
        this.left = null;
        this.right = null;
    }
}

class Deque {
    constructor() {
        this.front = [];
        this.back = [];
    }

    pushFront(val) {
        this.front.push(val);
    }

    pushBack(val) {
        this.back.push(val);
    }

    popFront() {
        if (this.front.length === 0) this._balance('front');
        return this.front.pop();
    }

    popBack() {
        if (this.back.length === 0) this._balance('back');
        return this.back.pop();
    }

    length() {
        return this.front.length + this.back.length;
    }

    _balance(side) {
        if (side === 'front') {
            while (this.back.length) this.front.push(this.back.pop());
        } else {
            while (this.front.length) this.back.push(this.front.pop());
        }
    }
}

function zigZagTraversal(root) {
    if (!root) return [];

    let res = [];
    let dq = new Deque();
    dq.pushBack(root);
    let reverse = false;

    while (dq.length() > 0) {
        let n = dq.length();
        
        for (let i = 0; i < n; i++) {
        
            // Push right to the front 
            // first if reverse is true
            if (reverse) {
                let curr = dq.popBack();
                res.push(curr.data);
                if (curr.right) dq.pushFront(curr.right);
                if (curr.left) dq.pushFront(curr.left);
            } 
            
            // Else push left to the back first
            else {
                let curr = dq.popFront();
                res.push(curr.data);
                if (curr.left) dq.pushBack(curr.left);
                if (curr.right) dq.pushBack(curr.right);
            }
        }

        reverse = !reverse;
    }

    return res;
}

// Driver code

// Create a input binary tree
//         20
//       /   \
//      8     22
//    /  \     \
//   4   12    11
//      /  \
//     10   14

let root = new Node(20);
root.left = new Node(8);
root.right = new Node(22);
root.right.right = new Node(11);
root.left.left = new Node(4);
root.left.right = new Node(12);
root.left.right.left = new Node(10);
root.left.right.right = new Node(14);

let res = zigZagTraversal(root);
console.log(res.join(" "));

Output
20 22 8 4 12 11 14 10 

ZigZag Tree Traversal | DSA Problem

Explore