ZigZag Tree Traversal of a Binary Tree
Last Updated : 08 Oct, 2025
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:
Output: [20, 22, 8, 4, 12, 11, 14, 10]
Explanation:
[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)); Output20 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(" ")); Output20 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(" ")); Output20 22 8 4 12 11 14 10
Explore
DSA Fundamentals
Data Structures
Algorithms
Advanced
Interview Preparation
Practice Problem
My Profile