import
java.util.LinkedList;
import
java.util.Queue;
import
java.util.Vector;
class
Node {
int
data;
Node left;
Node right;
Node(
int
data) {
this
.data = data;
left =
null
;
right =
null
;
}
}
public
class
Main {
static
boolean
isLeaf(Node root) {
return
root.left ==
null
&& root.right ==
null
;
}
static
int
findMinOperation(Vector<Integer> leafs) {
int
val = leafs.get(
0
);
for
(
int
i =
1
; i < leafs.size(); i++) {
val = (val + leafs.get(i)) /
2
;
}
int
ans =
0
;
for
(
int
i =
0
; i < leafs.size(); i++) {
ans += Math.abs(val - leafs.get(i));
}
return
ans;
}
static
int
minimumOperation(Node root) {
if
(root ==
null
)
return
0
;
int
minOperation =
0
;
Queue<Node> q =
new
LinkedList<>();
q.add(root);
while
(!q.isEmpty()) {
int
n = q.size();
Vector<Integer> leafs =
new
Vector<>();
for
(
int
i =
0
; i < n; i++) {
Node temp = q.poll();
if
(temp.left !=
null
)
q.add(temp.left);
if
(temp.right !=
null
)
q.add(temp.right);
if
(isLeaf(temp))
leafs.add(temp.data);
}
if
(leafs.size() >
1
) {
minOperation += findMinOperation(leafs);
}
}
return
minOperation;
}
public
static
void
main(String[] args) {
Node root =
new
Node(
6
);
root.left =
new
Node(
4
);
root.right =
new
Node(
2
);
root.left.left =
new
Node(
1
);
root.left.right =
new
Node(
9
);
root.right.left =
new
Node(
5
);
root.right.right =
new
Node(
3
);
root.left.left.right =
new
Node(
10
);
System.out.println(minimumOperation(root));
}
}