import
java.util.Queue;
import
java.util.LinkedList;
class
Node {
int
data;
Node left, right;
public
Node(
int
data)
{
this
.data = data;
left = right =
null
;
}
}
class
Main
{
static
boolean
isLeaf(Node root)
{
return
(root.left ==
null
&& root.right ==
null
);
}
static
void
sink(Node root)
{
if
(root ==
null
|| isLeaf(root))
return
;
if
(root.left !=
null
&& (root.left.data &
1
) !=
0
)
{
int
temp = root.data;
root.data = root.left.data;
root.left.data = temp;
sink(root.left);
}
else
if
(root.right !=
null
&& (root.right.data &
1
) !=
0
)
{
int
temp = root.data;
root.data = root.right.data;
root.right.data = temp;
sink(root.right);
}
}
static
void
sinkEvenNodes(Node root)
{
if
(root ==
null
|| isLeaf(root))
return
;
sinkEvenNodes(root.left);
sinkEvenNodes(root.right);
if
((root.data &
1
) ==
0
)
sink(root);
}
static
void
printLevelOrder(Node root)
{
Queue<Node> q =
new
LinkedList<Node>();
q.add(root);
while
(q.size() >
0
) {
int
nodeCount = q.size();
while
(nodeCount >
0
) {
Node node = q.peek();
System.out.print(node.data +
" "
);
q.remove();
if
(node.left !=
null
)
q.add(node.left);
if
(node.right !=
null
)
q.add(node.right);
nodeCount--;
}
System.out.println();
}
}
public
static
void
main(String[] args)
{
Node root =
new
Node(
1
);
root.left =
new
Node(
5
);
root.right =
new
Node(
8
);
root.left.left =
new
Node(
2
);
root.left.right =
new
Node(
4
);
root.right.left =
new
Node(
9
);
root.right.right =
new
Node(
10
);
sinkEvenNodes(root);
printLevelOrder(root);
}
}