package problems.medium;
import java.util.LinkedList;
import java.util.ListIterator;
/**
* Created by sherxon on 1/9/17.
*/
public class PopulatingNextRightPointersinEachNode {
public static void main(String[] args) {
TreeLinkNode head=new TreeLinkNode(1);
head.left=new TreeLinkNode(2);
head.right=new TreeLinkNode(3);
new PopulatingNextRightPointersinEachNode().connect(head);
System.out.println(head);
}
public void connect(TreeLinkNode root) {
if(root==null)return;
LinkedList<TreeLinkNode> q=new LinkedList<>();
LinkedList<TreeLinkNode> level=new LinkedList<>();
q.add(root);
level.add(root);
while(!q.isEmpty()){
TreeLinkNode x=q.removeFirst();
if(x.left!=null)
q.add(x.left);
if(x.right!=null)
q.add(x.right);
level.removeFirst();
if(level.isEmpty() && !q.isEmpty()){
ListIterator<TreeLinkNode> iterator=q.listIterator(q.size());
TreeLinkNode right=null;
while (iterator.hasPrevious()){
TreeLinkNode current=iterator.previous();
current.next=right;
right=current;
level.addFirst(current);
}
}
}
}
//second solution
public void connect2(TreeLinkNode root) {
TreeLinkNode level_start=root;
while(level_start!=null){
TreeLinkNode cur=level_start;
while(cur!=null){
if(cur.left!=null) cur.left.next=cur.right;
if(cur.right!=null && cur.next!=null) cur.right.next=cur.next.left;
cur=cur.next;
}
level_start=level_start.left;
}
}
}
class TreeLinkNode {
int val;
TreeLinkNode left, right, next;
TreeLinkNode(int x) { val = x; }
}