public static void connect(TreeLinkNode root) {
    if (root == null) return;
    Queue<TreeLinkNode> Q1 = new LinkedList<TreeLinkNode>();
    Queue<TreeLinkNode> Q2 = new LinkedList<TreeLinkNode>();

    Q1.add(root);

    while ((!Q1.isEmpty()) || (!Q2.isEmpty())) {
      while (!Q1.isEmpty()) {
        TreeLinkNode node = Q1.poll();
        if (node.left != null) Q2.add(node.left);
        if (node.right != null) Q2.add(node.right);
        node.next = Q1.peek();
      }
      while (!Q2.isEmpty()) {
        TreeLinkNode node = Q2.poll();
        if (node.left != null) Q1.add(node.left);
        if (node.right != null) Q1.add(node.right);
        node.next = Q2.peek();
      }
    }
  }