import
java.io.*;
import
java.util.*;
class
TreeNode {
int
val;
TreeNode left;
TreeNode right;
TreeNode(
int
val, TreeNode left, TreeNode right)
{
this
.val = val;
this
.left = left;
this
.right = right;
}
}
class
GFG {
static
int
nearest_pow(
int
x,
int
base1)
{
int
k = (
int
)Math.floor(Math.log(x)
/ Math.log(base1));
if
(Math.abs(Math.pow(base1, k) - x)
< Math.abs(Math.pow(base1, k +
1
) - x)) {
return
(
int
)Math.pow(base1, k);
}
else
{
return
(
int
)Math.pow(base1, k +
1
);
}
}
static
void
print_level_order(TreeNode root)
{
if
(root ==
null
) {
return
;
}
Queue<TreeNode> q =
new
LinkedList<>();
q.add(root);
while
(!q.isEmpty()) {
int
count = q.size();
while
(count-- >
0
) {
TreeNode temp = q.poll();
System.out.print(temp.val +
" "
);
if
(temp.left !=
null
) {
q.add(temp.left);
}
if
(temp.right !=
null
) {
q.add(temp.right);
}
}
}
}
static
void
replace_nodes(TreeNode root)
{
Queue<TreeNode> que =
new
LinkedList<TreeNode>();
que.add(root);
int
lvl =
1
;
int
min_prev = root.val;
int
min_curr = root.val;
while
(
true
) {
int
length = que.size();
if
(length ==
0
) {
break
;
}
min_prev = min_curr;
min_curr = Integer.MAX_VALUE;
while
(length-- >
0
) {
TreeNode temp = que.poll();
min_curr = Math.min(temp.val, min_curr);
temp.val = nearest_pow(temp.val, min_prev);
if
(temp.left !=
null
) {
que.add(temp.left);
}
if
(temp.right !=
null
) {
que.add(temp.right);
}
}
lvl++;
}
print_level_order(root);
}
public
static
void
main(String[] args)
{
TreeNode root =
new
TreeNode(
7
,
null
,
null
);
root.left =
new
TreeNode(
4
,
null
,
null
);
root.right =
new
TreeNode(
11
,
null
,
null
);
root.left.right =
new
TreeNode(
23
,
null
,
null
);
replace_nodes(root);
}
}