import
java.io.*;
import
java.util.*;
class
TreeNode
{
int
val =
0
;
TreeNode left;
TreeNode right;
TreeNode(
int
x)
{
val = x;
left = right =
null
;
}
}
class
GFG {
static
Map<Integer, ArrayList<ArrayList<Integer>>> mp =
new
HashMap<Integer, ArrayList<ArrayList<Integer>>>();
static
int
getDecimal(ArrayList<ArrayList<Integer> > arr)
{
Collections.sort(arr,
new
Comparator<ArrayList<Integer>>() {
@Override
public
int
compare(ArrayList<Integer> o1, ArrayList<Integer> o2) {
return
o1.get(
0
).compareTo(o2.get(
0
));
}
});
int
ans =
0
;
for
(
int
i =
0
; i < arr.size(); i++)
{
ans <<=
1
;
ans |= arr.get(i).get(
1
);
}
return
ans;
}
static
void
Traverse(TreeNode root,
int
hd,
int
ht)
{
if
(root ==
null
)
return
;
if
(mp.containsKey(hd))
{
mp.get(hd).add(
new
ArrayList<Integer>(Arrays.asList(ht, root.val)));
}
else
{
mp.put(hd,
new
ArrayList<ArrayList<Integer>>());
mp.get(hd).add(
new
ArrayList<Integer>(Arrays.asList(ht, root.val)));
}
Traverse(root.left, hd -
1
, ht +
1
);
Traverse(root.right, hd +
1
, ht +
1
);
}
static
void
getSum(TreeNode root)
{
Traverse(root,
0
,
0
);
int
ans =
0
;
for
(Integer key : mp.keySet())
{
ans += getDecimal(mp.get(key));
}
System.out.print(ans);
}
public
static
void
main (String[] args)
{
TreeNode root =
new
TreeNode(
1
);
root.left =
new
TreeNode(
1
);
root.right =
new
TreeNode(
0
);
root.left.left =
new
TreeNode(
1
);
root.left.right =
new
TreeNode(
0
);
root.right.left =
new
TreeNode(
1
);
root.right.right =
new
TreeNode(
0
);
getSum(root);
}
}