I think there's a simpler solution, with one loop and no recursion, in O(n) time and O(1) space.
static Node treeToCycle(Node root) {
Node pseudoRoot = new Node();
pseudoRoot.left = null;
pseudoRoot.right = root;
Node tail = pseudoRoot;
Node rest = root;
while (rest != null) {
if (rest.left == null) {
rest.left = tail;
tail = rest;
rest = rest.right;
} else {
Node temp = rest.left;
rest.left = temp.right;
temp.right = rest;
rest = temp;
tail.right = temp;
}
}
Node head = pseudoRoot.right;
head.left = tail;
tail.right = head;
return head;
}