#include <bits/stdc++.h>
using
namespace
std;
struct
Node {
int
data;
Node *left, *right;
};
Node* getNode(
int
data)
{
Node* newNode
= (Node*)
malloc
(
sizeof
(Node));
newNode->data = data;
newNode->left = newNode->right = NULL;
return
newNode;
}
int
digitSum(
int
N)
{
int
sum = 0;
while
(N) {
sum += N % 10;
N /= 10;
}
return
sum;
}
void
replaceNodes(Node* root)
{
if
(!root)
return
;
root->data = digitSum(root->data);
replaceNodes(root->left);
replaceNodes(root->right);
}
int
countSubtreesWithSumX(Node* root,
int
& count,
int
x)
{
if
(!root)
return
0;
int
ls = countSubtreesWithSumX(
root->left, count, x);
int
rs = countSubtreesWithSumX(
root->right, count, x);
int
sum = ls + rs + root->data;
if
(sum == x)
count++;
return
sum;
}
int
countSubtreesWithSumXUtil(Node* root,
int
x)
{
if
(!root)
return
0;
int
count = 0;
int
ls = countSubtreesWithSumX(
root->left, count, x);
int
rs = countSubtreesWithSumX(
root->right, count, x);
if
((ls + rs + root->data) == x)
count++;
return
count;
}
int
main()
{
int
N = 7;
Node* root = getNode(10);
root->left = getNode(2);
root->right = getNode(3);
root->left->left = getNode(9);
root->left->right = getNode(3);
root->right->left = getNode(4);
root->right->right = getNode(7);
replaceNodes(root);
int
X = 29;
cout << countSubtreesWithSumXUtil(root, X);
return
0;
}