import
java.util.*;
class
Node {
public
int
data;
public
Node left, right;
public
Node(
int
x)
{
data = x;
left =
null
;
right =
null
;
}
}
class
minMax {
public
int
min, max;
public
minMax(
int
x,
int
y)
{
min = x;
max = y;
}
}
class
GFG {
static
int
minm(minMax a, minMax b)
{
if
(a !=
null
&& b !=
null
) {
if
(a.min < b.min)
return
a.min;
return
b.min;
}
if
(a ==
null
)
return
b.min;
return
a.min;
}
static
int
maxm(minMax a, minMax b)
{
if
(a !=
null
&& b !=
null
) {
if
(a.max > b.max)
return
a.max;
return
b.max;
}
if
(a ==
null
)
return
b.max;
return
a.max;
}
static
minMax minMaxTreeUtil(Node root)
{
if
(root ==
null
)
return
null
;
minMax var1 =
new
minMax(
1000000000
, -
1000000000
);
if
(root.left ==
null
&& root.right ==
null
) {
var1.min = root.data;
var1.max = root.data;
return
var1;
}
minMax left = minMaxTreeUtil(root.left);
minMax right = minMaxTreeUtil(root.right);
var1.min = minm(left, right);
var1.max = maxm(left, right);
int
currData = root.data;
root.data = var1.min * var1.max;
var1.min = Math.min(var1.min, currData);
var1.max = Math.max(var1.max, currData);
return
var1;
}
static
void
printt(Node root)
{
if
(root ==
null
)
return
;
ArrayList<Node> q =
new
ArrayList<Node>();
q.add(root);
while
(q.size() >
0
) {
int
nodeCount = q.size();
while
(nodeCount >
0
) {
Node node = q.get(
0
);
q.remove(
0
);
System.out.print(node.data +
" "
);
if
(node.left !=
null
)
q.add(node.left);
if
(node.right !=
null
)
q.add(node.right);
nodeCount -=
1
;
}
}
}
static
void
minMaxProductTree(Node root)
{
minMaxTreeUtil(root);
printt(root);
}
public
static
void
main(String[] args)
{
Node root =
new
Node(
10
);
root.left =
new
Node(
48
);
root.right =
new
Node(
3
);
root.right.left =
new
Node(
11
);
root.right.right =
new
Node(
37
);
root.right.left.left =
new
Node(
7
);
root.right.left.right =
new
Node(
29
);
root.right.right.left =
new
Node(
42
);
root.right.right.right =
new
Node(
19
);
root.right.right.right.left =
new
Node(
7
);
minMaxProductTree(root);
}
}