import
java.io.*;
import
java.util.*;
class
GFG {
static
int
N = (
int
)1e6;
static
List<Integer> prime =
new
ArrayList<>();
static
void
SieveOfEratosthenes()
{
boolean
check[] =
new
boolean
[N +
1
];
for
(
int
p =
2
; p * p <= N; p++)
{
if
(check[p] ==
true
) {
prime.add(p);
for
(
int
i = p * p; i <= N; i += p) {
check[i] =
false
;
}
}
}
}
static
class
Node {
int
key;
Node left, right;
}
static
Node newNode(
int
key)
{
Node temp =
new
Node();
temp.key = key;
temp.left = temp.right =
null
;
return
temp;
}
static
boolean
is_key(
int
n,
int
x)
{
double
p;
p = Math.log10(n) / Math.log10(x);
int
no = (
int
)(Math.pow(x, (
int
)p));
if
(n == no) {
return
true
;
}
return
false
;
}
static
int
find_x(
int
n)
{
if
(n ==
1
) {
return
1
;
}
double
num, den, p;
num = Math.log10(n);
int
x =
0
;
int
no;
for
(
int
i =
2
; i <= n; i++) {
den = Math.log10(i);
p = num / den;
no = (
int
)(Math.pow(i, (
int
)p));
if
(Math.abs(no - n) < 1e-
6
) {
x = i;
break
;
}
}
return
x;
}
static
boolean
isLevelExponential(List<Integer> L)
{
int
x = find_x(L.get(
0
));
for
(
int
i =
1
; i < L.size(); i++)
{
if
(!is_key(L.get(i), x)) {
return
false
;
}
}
return
true
;
}
static
void
printExponentialLevels(List<Integer> Lev)
{
for
(
int
i =
0
; i < Lev.size(); i++) {
System.out.print(Lev.get(i) +
" "
);
}
System.out.println();
}
static
void
find_ExponentialLevels(Node node,
List<Node> queue,
int
index,
int
size)
{
List<Integer> Lev =
new
ArrayList<Integer>();
while
(index < size) {
int
curr_size = size;
while
(index < curr_size) {
Node temp = queue.get(index);
Lev.add(temp.key);
if
(temp.left !=
null
) {
queue.add(size++, temp.left);
}
if
(temp.right !=
null
) {
queue.add(size++, temp.right);
}
index++;
}
if
(isLevelExponential(Lev)) {
printExponentialLevels(Lev);
}
Lev.clear();
}
}
static
int
findSize(Node node)
{
if
(node ==
null
) {
return
0
;
}
return
1
+ findSize(node.left)
+ findSize(node.right);
}
static
void
printExponentialLevels(Node node)
{
int
t_size = findSize(node);
List<Node> queue =
new
ArrayList<>(t_size);
queue.add(
0
, node);
find_ExponentialLevels(node, queue,
0
,
1
);
}
public
static
void
main(String[] args)
{
Node root = newNode(
20
);
root.left = newNode(
9
);
root.right = newNode(
81
);
root.left.left = newNode(
3
);
root.left.right = newNode(
9
);
root.right.left = newNode(
81
);
root.right.right = newNode(
243
);
root.right.left.left = newNode(
81
);
root.right.right.right = newNode(
909
);
SieveOfEratosthenes();
printExponentialLevels(root);
}
}