import
java.io.*;
import
java.util.*;
@SuppressWarnings
(
"unchecked"
)
class
Isosceles_triangles {
static
int
MAX_SZ = (
int
)1e5;
static
ArrayList<Integer>[] graph;
static
int
[] right_down =
new
int
[MAX_SZ];
static
int
[] left_down =
new
int
[MAX_SZ];
static
int
[] right_up =
new
int
[MAX_SZ];
static
int
[] left_up =
new
int
[MAX_SZ];
public
static
void
DFS(
int
u,
int
[] parent)
{
if
(graph[u] !=
null
)
Collections.sort(graph[u]);
if
(parent[u] != -
1
) {
if
(graph[parent[u]].size() >
1
) {
if
(u == graph[parent[u]].get(
0
)) {
right_up[u] += right_up[parent[u]] +
1
;
}
else
{
left_up[u] += left_up[parent[u]] +
1
;
}
}
else
{
right_up[u] += right_up[parent[u]] +
1
;
}
}
if
(graph[u] ==
null
)
return
;
for
(
int
i =
0
; i < graph[u].size(); ++i) {
int
v = graph[u].get(i);
DFS(v, parent);
if
(i ==
0
) {
left_down[u] += left_down[v] +
1
;
}
else
{
right_down[u] += right_down[v] +
1
;
}
}
}
static
int
min(Integer a, Integer b)
{
return
(a < b) ? a : b;
}
public
static
int
generateGraph(
int
[] parent,
int
n)
{
int
root = -
1
;
graph = (ArrayList<Integer>[])
new
ArrayList[n];
for
(
int
i =
0
; i < n; ++i) {
if
(parent[i] != -
1
) {
if
(graph[parent[i]] ==
null
) {
graph[parent[i]] =
new
ArrayList<Integer>();
}
graph[parent[i]].add(i);
}
else
{
root = i;
}
left_up[i] =
0
;
right_up[i] =
0
;
left_down[i] =
0
;
right_down[i] =
0
;
}
return
root;
}
public
static
void
main(String[] args)
{
int
n =
10
;
int
[] parent =
new
int
[] { -
1
,
0
,
0
,
1
,
1
,
2
,
2
,
3
,
4
,
4
};
int
root = generateGraph(parent, n);
DFS(root, parent);
int
count =
0
;
for
(
int
i =
0
; i < n; ++i) {
count += min(right_down[i], right_up[i]);
count += min(left_down[i], left_up[i]);
count += min(left_down[i], right_down[i]);
}
System.out.println(
"Number of isosceles triangles "
+
"in the given binary tree are "
+ Integer.toString(count));
System.exit(
0
);
}
}