Reverse alternate levels of a perfect binary tree

Given a Perfect Binary Tree, reverse the alternate level nodes of the binary tree.

  
Given tree: 
               a
            /     \
           b       c
         /  \     /  \
        d    e    f    g
       / \  / \  / \  / \
       h  i j  k l  m  n  o 

Modified tree:
             a
            /     \
           c       b
         /  \     /  \
        d    e    f    g
       / \  / \  / \  / \
      o  n m  l k  j  i  h 
class Tree {
    static void reverseAlternate(Node root) {
        if (root == null)
            return;
        Queue<Node> q = new LinkedList<>();
        q.add(root);
        ArrayList<Node> level1 = new ArrayList<>();
        boolean rotate = false;
        while (q.size() != 0) {
            int size = q.size();
            ArrayList<Node> level2 = new ArrayList<>();
            while (size-- > 0) {
                Node temp = q.poll();
                level2.add(temp);
                if (temp.left != null)
                    q.add(temp.left);
                if (temp.right != null)
                    q.add(temp.right);
            }
            if (level1.size() > 0) {
                if (rotate)
                    Collections.reverse(level2);
                for (int i = 0; i < level1.size(); i++) {
                    level1.get(i).left = level2.get(2 * i);
                    level1.get(i).right = level2.get(2 * i + 1);
                }
            }
            rotate = !rotate;
            level1 = level2;
        }
    }
}

Last updated