public static class Node{
public int value;
public Node left;
public Node right;
public Node(int data){
this.value = data;
}
}
public static Node convert1(Node head){
Queue<Node> queue = new LinkedList<Node>();
inOrderToQueue(head, queue);
if(queue.isEmpty()){
return head;
}
head = queue.poll();
Node pre = head;
pre.left = null;
Node cur = null;
while(!queue.isEmpty()){
cur = queue.poll();
pre.right = cur;
cur.left = pre;
pre = cur;
}
pre.right = null;
return head;
}
public static void inOrderToQueue(Node head, Queue<Node> queue){
if(head == null){
return;
}
inOrderToQueue(head.left, queue);
queue.offer(head);
inOrderToQueue(head.right, queue);
}
public static Node convert2(Node head){
if(head == null){
return null;
}
Node last = process(head);
head = last.right;
last.right = null;
return head;
}
public static Node process(Node head){
if(head == null){
return null;
}
Node leftE = process(head.left); //left end
Node rightE = process(head.right); //right end
Node leftS = leftE != null ? leftE.right : null; //left start
Node rightS == rightS != null ? rightE.right : null; //right start
if(leftE != null && rightE != null){
leftE.right = head;
head.left = leftE;
head.right = rightS;
rightS.left = head;
rightE.right = leftS;
return rightE;
}else if(leftE != null){
leftE.right = head;
head.left = leftE;
head.right = leftS;
return head;
}else if(rightE != null){
head.right = rightS;
rightS.left = head;
rightE.right = head;
return rightE;
}else{
head.right = head;
return head;
}
}