import
java.util.LinkedList;
import
java.util.Queue;
import
java.util.SortedSet;
import
java.util.TreeSet;
class
Tuple<T1, T2> {
public
final
T1 first;
public
final
T2 second;
public
Tuple(T1 item1, T2 item2)
{
this
.first = item1;
this
.second = item2;
}
}
class
Node {
public
int
data;
public
Node left, right;
}
class
VerticalOrderTraversal {
public
static
void
main(String[] args)
{
Node root = newNode(
1
);
root.left = newNode(
2
);
root.right = newNode(
3
);
root.left.left = newNode(
4
);
root.left.right = newNode(
5
);
root.right.left = newNode(
6
);
root.right.right = newNode(
7
);
root.right.left.right = newNode(
8
);
root.right.right.right = newNode(
9
);
System.out.println(
"Vertical order traversal is "
);
verticalOrder(root);
}
public
static
Node newNode(
int
data)
{
Node temp =
new
Node();
temp.data = data;
temp.left = temp.right =
null
;
return
temp;
}
public
static
void
verticalOrder(Node root)
{
Queue<Tuple<Node, Tuple<Integer, Integer> > > qu
=
new
LinkedList<>();
SortedSet<Tuple<Tuple<Integer, Integer>,
Tuple<Integer, Integer> > > minH
=
new
TreeSet<>((o1, o2) -> {
if
(o1.first.first.equals(
o2.first.first)) {
if
(o1.first.second.equals(
o2.first.second)) {
return
o1.second.first.compareTo(
o2.second.first);
}
return
o1.first.second.compareTo(
o2.first.second);
}
return
o1.first.first.compareTo(
o2.first.first);
});
int
v =
0
;
int
l =
0
;
qu.add(
new
Tuple<Node, Tuple<Integer, Integer> >(
root,
new
Tuple<Integer, Integer>(v, l)));
while
(!qu.isEmpty()) {
int
s = qu.size();
int
i =
0
;
while
(i < s) {
Node node = qu.peek().first;
v = qu.peek().second.first;
l = qu.peek().second.second;
minH.add(
new
Tuple<Tuple<Integer, Integer>,
Tuple<Integer, Integer> >(
new
Tuple<Integer, Integer>(v, l),
new
Tuple<Integer, Integer>(
i, node.data)));
qu.remove();
if
(node.left !=
null
)
qu.add(
new
Tuple<Node,
Tuple<Integer, Integer> >(
node.left,
new
Tuple<Integer, Integer>(
v -
1
, l +
1
)));
if
(node.right !=
null
)
qu.add(
new
Tuple<Node,
Tuple<Integer, Integer> >(
node.right,
new
Tuple<Integer, Integer>(
v +
1
, l +
1
)));
i++;
}
}
while
(!minH.isEmpty()) {
int
vi = minH.first().first.first;
System.out.print(minH.first().second.second
+
" "
);
minH.remove(minH.first());
if
(!minH.isEmpty()
&& vi != minH.first().first.first)
System.out.println();
}
}
}