package tree; import java.util.ArrayDeque; import java.util.Queue; /** * Created by gouthamvidyapradhan on 07/07/2017. *

* Given a binary tree *

* struct TreeLinkNode { * TreeLinkNode *left; * TreeLinkNode *right; * TreeLinkNode *next; * } * Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL. *

* Initially, all next pointers are set to NULL. *

* Note: *

* You may only use constant extra space. * You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children). * For example, * Given the following perfect binary tree, * 1 * / \ * 2 3 * / \ / \ * 4 5 6 7 * After calling your function, the tree should look like: * 1 -> NULL * / \ * 2 -> 3 -> NULL * / \ / \ * 4->5->6->7 -> NULL *

* Solution: Perform a level order traversal using BFS, keep track of prev node at each level. Link the prev node to * current node if both the nodes are in the same level. */ public class NextRightPointer { private class LevelNode { int level; TreeLinkNode node; LevelNode(TreeLinkNode node, int level) { this.node = node; this.level = level; } } public static class TreeLinkNode { int val; TreeLinkNode left, right, next; TreeLinkNode(int x) { val = x; } } public static void main(String[] args) throws Exception { TreeLinkNode node = new TreeLinkNode(2); node.left = new TreeLinkNode(1); node.right = new TreeLinkNode(3); new NextRightPointer().connect(node); System.out.println(node.next); System.out.println(node.left.next.val); System.out.println(node.right.next); } public void connect(TreeLinkNode root) { Queue queue = new ArrayDeque<>(); LevelNode zero = new LevelNode(root, 0); queue.offer(zero); LevelNode prev = null; while (!queue.isEmpty()) { LevelNode levelNode = queue.poll(); if (levelNode.node == null) break; TreeLinkNode curr = levelNode.node; if (prev != null) { if (prev.level == levelNode.level) { prev.node.next = levelNode.node; } } prev = levelNode; queue.offer(new LevelNode(curr.left, levelNode.level + 1)); queue.offer(new LevelNode(curr.right, levelNode.level + 1)); } } }