- Write a C program to check if a binary tree satisfy Children Sum Property.

Given a binary tree We have to check whether given binary tree satisfy **children sum property**. We will traverse each node of binary tree and check whether **children sum property** holds true for each node or not.

**Children Sum Property of Binary Tree**

If the value of every node of a binary tree is equal to the sum of it's left and right child node then binary tree satisfies child sum property.

- A sub tree rooted at a leaf node satisfies children sum property because leaf nodes don't have any child nodes.
- An Empty tree satisfies Children sum property.

**Algorithm to check Children Sum property of a binary tree**

Let "node" be the pointer to any node of binary tree.

- If node is NULL, then return true.
- If node is leaf node, then return true.
- If node's value is equal to sum of left and right child nodes and left and right sub trees also satisfies Children sum property. Then sub tree rooted at node satisfies children sum property.

**Time Complexity**: O(n), we are traversing binary tree only once.

## C program to check children sum property of binary tree

#include <stdio.h> struct node { int data; struct node *left; struct node *right; }; struct node* getNewNode(int data) { /* dynamically allocate memory for a new node */ struct node* newNode = (struct node*)malloc(sizeof(struct node)); /* populate data in new Node */ newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } /* This function returns a binary tree which satisfy children sum property 10 / \ 4 6 / \ / \ 2 2 3 3 */ struct node* generateBTree(){ // Root Node struct node* root = getNewNode(10); root->left = getNewNode(4); root->right = getNewNode(6); root->left->left = getNewNode(2); root->left->right = getNewNode(2); root->right->left = getNewNode(3); root->right->right = getNewNode(3); return root; } /* Checks whether a tree satisfies the children sum property or not. If tree satisfies children sum property then it returns 1 otherwise 0 */ int isChildrenSumTree(struct node *root) { if(root == NULL) return 1; if(root->left == NULL && root->right == NULL) return 1; int leftData = (root->left == NULL) ? 0 : root->left->data; int rightData = (root->right == NULL) ? 0 : root->right->data; if(isChildrenSumTree(root->left) && isChildrenSumTree(root->right) && (leftData + rightData == root->data)) return 1; else return 0; } int main() { struct node *root = generateBTree(); /* Check for Children sum property */ if(isChildrenSumTree(root)){ printf("Tree Satisfy Children Sum Property\n"); } else { printf("Tree Don't Satisfy Children Sum Property"); } /* Changing the value of a node such that it won't satisfy children sum property */ root->left->data = 100; if(isChildrenSumTree(root)){ printf("Tree Satisfy Children Sum Property\n"); } else { printf("Tree Don't Satisfy Children Sum Property"); } getchar(); return 0; }Output

Tree Satisfy Children Sum Property Tree Don't Satisfy Children Sum Property