#include <iostream>
using
namespace
std;
bool
hasValidSubTree =
false
;
struct
node {
int
data;
struct
node *right, *left;
};
struct
node* newnode(
int
key)
{
struct
node* temp =
new
node;
temp->data = key;
temp->right = NULL;
temp->left = NULL;
return
temp;
}
void
inorder(
struct
node* root)
{
if
(root == NULL)
return
;
inorder(root->left);
cout << root->data << endl;
inorder(root->right);
}
int
size(
struct
node* root)
{
int
a = 0, b = 0;
if
(root == NULL || hasValidSubTree)
return
0;
a = size(root->right);
a = a + 1;
b = size(root->left);
a = b + a;
if
(a % 2 == 0 && root->data == a / 2)
hasValidSubTree =
true
;
return
a;
}
int
sum_tree(
struct
node* root)
{
if
(root == NULL)
return
0;
int
a = 0, b = 0;
if
(root->left != NULL)
a = sum_tree(root->left);
if
(root->right != NULL)
b = sum_tree(root->right);
root->data += (a + b);
return
root->data;
}
int
main()
{
struct
node* root = newnode(1);
root->right = newnode(0);
root->right->right = newnode(1);
root->right->right->right = newnode(1);
root->left = newnode(0);
root->left->left = newnode(1);
root->left->left->left = newnode(1);
root->left->right = newnode(0);
root->left->right->left = newnode(1);
root->left->right->left->left = newnode(1);
root->left->right->right = newnode(0);
root->left->right->right->left = newnode(1);
root->left->right->right->left->left = newnode(1);
sum_tree(root);
size(root);
if
(hasValidSubTree)
cout <<
"Yes"
;
else
cout <<
"No"
;
return
0;
}