public
class
Main
{
static
class
Node {
public
int
key;
public
Node left, right;
public
Node(
int
key)
{
this
.key = key;
left = right =
null
;
}
}
static
Node newNode(
int
key)
{
Node temp =
new
Node(key);
return
temp;
}
static
boolean
isPrime(
int
n)
{
if
(n ==
1
)
return
false
;
for
(
int
i =
2
; i * i <= n; i++)
{
if
(n % i ==
0
)
{
return
false
;
}
}
return
true
;
}
static
void
printLevel(Node[] queue,
int
index,
int
size)
{
for
(
int
i = index; i < size; i++)
{
System.out.print(queue[i].key +
" "
);
}
System.out.println();
}
static
boolean
isLevelPrime(Node[] queue,
int
index,
int
size)
{
for
(
int
i = index; i < size; i++)
{
if
(!isPrime(queue[index++].key))
{
return
false
;
}
}
return
true
;
}
static
void
findPrimeLevels(Node node, Node[] queue,
int
index,
int
size)
{
if
(isPrime(queue[index].key))
{
System.out.println(queue[index].key);
}
while
(index < size)
{
int
curr_size = size;
while
(index < curr_size)
{
Node temp = queue[index];
if
(temp.left !=
null
)
queue[size++] = temp.left;
if
(temp.right !=
null
)
queue[size++] = temp.right;
index++;
}
if
(isLevelPrime(queue, index, size -
1
))
{
printLevel(queue, index, size);
}
}
}
static
int
findSize(Node node)
{
if
(node ==
null
)
return
0
;
return
1
+ findSize(node.left) +
findSize(node.right);
}
static
void
printPrimeLevels(Node node)
{
int
t_size = findSize(node);
Node[] queue =
new
Node[t_size];
for
(
int
i =
0
; i < t_size; i++)
{
queue[i] =
new
Node(
0
);
}
queue[
0
] = node;
findPrimeLevels(node, queue,
0
,
1
);
}
public
static
void
main(String[] args) {
Node root = newNode(
10
);
root.left = newNode(
13
);
root.right = newNode(
11
);
root.right.left = newNode(
19
);
root.right.right = newNode(
23
);
root.right.left.left = newNode(
21
);
root.right.left.right = newNode(
29
);
root.right.right.left = newNode(
43
);
root.right.right.right = newNode(
15
);
root.right.right.right.left = newNode(
7
);
printPrimeLevels(root);
}
}