import
java.util.*;
class
GFG{
static
class
Node
{
int
data;
Node left, right;
};
static
Node newNode(
int
x)
{
Node temp =
new
Node();
temp.data = x;
temp.left = temp.right =
null
;
return
temp;
};
static
boolean
check_horizontal(Node root)
{
Vector<Integer> sumLevel =
new
Vector<Integer>();
int
index = -
1
, maxSum =
0
, level =
0
;
Queue<Node> q =
new
LinkedList<Node>();
q.add(root);
while
(!q.isEmpty())
{
int
sum =
0
;
int
n = q.size();
for
(
int
i =
0
; i < n; i++)
{
Node temp = q.peek();
sum += temp.data;
if
(temp.left !=
null
)
q.add(temp.left);
if
(temp.right !=
null
)
q.add(temp.right);
q.remove();
}
sumLevel.add(sum);
if
(sum > maxSum)
{
maxSum = sum;
index = level;
}
level++;
}
int
leftSum =
0
, rightSum =
0
;
for
(
int
i =
0
; i < index; i++)
{
leftSum += sumLevel.get(i);
}
for
(
int
i = index +
1
;
i < sumLevel.size(); i++)
{
rightSum += sumLevel.get(i);
}
return
(leftSum == rightSum);
}
public
static
void
main(String[] args)
{
Node root = newNode(
1
);
root.left = newNode(
2
);
root.right = newNode(
3
);
root.left.left = newNode(
4
);
root.left.right = newNode(
5
);
root.right.right = newNode(
8
);
root.right.right.left = newNode(
2
);
root.right.right.right = newNode(
4
);
if
(check_horizontal(root))
System.out.print(
"YES"
+
"\n"
);
else
System.out.print(
"NO"
+
"\n"
);
}
}