# Check if a given Binary Tree is SumTree

• Difficulty Level : Medium
• Last Updated : 21 Jun, 2022

Write a function that returns true if the given Binary Tree is SumTree else false. A SumTree is a Binary Tree where the value of a node is equal to the sum of the nodes present in its left subtree and right subtree. An empty tree is SumTree and the sum of an empty tree can be considered as 0. A leaf node is also considered as SumTree.

Following is an example of SumTree.

```          26
/   \
10     3
/    \     \
4      6      3```

Method 1 (Simple)
Get the sum of nodes in the left subtree and right subtree. Check if the sum calculated is equal to the root’s data. Also, recursively check if the left and right subtrees are SumTrees.

## C++

 `// C++ program to check if Binary tree` `// is sum tree or not` `#include ` `using` `namespace` `std;`   `// A binary tree node has data, ` `// left child and right child ` `struct` `node` `{` `    ``int` `data;` `    ``struct` `node* left;` `    ``struct` `node* right;` `};`   `// A utility function to get the sum` `// of values in tree with root as root ` `int` `sum(``struct` `node *root)` `{` `    ``if` `(root == NULL)` `        ``return` `0;` `    `  `    ``return` `sum(root->left) + root->data +` `           ``sum(root->right);` `}`   `// Returns 1 if sum property holds for` `// the given node and both of its children ` `int` `isSumTree(``struct` `node* node)` `{` `    ``int` `ls, rs;`   `    ``// If node is NULL or it's a leaf` `    ``// node then return true ` `    ``if` `(node == NULL ||` `       ``(node->left == NULL && ` `        ``node->right == NULL))` `        ``return` `1;`   `   ``// Get sum of nodes in left and` `   ``// right subtrees ` `   ``ls = sum(node->left);` `   ``rs = sum(node->right);`   `   ``// If the node and both of its ` `   ``// children satisfy the property ` `   ``// return 1 else 0` `    ``if` `((node->data == ls + rs) &&` `          ``isSumTree(node->left) &&` `          ``isSumTree(node->right))` `        ``return` `1;`   `   ``return` `0;` `}`   `// Helper function that allocates a new node` `// with the given data and NULL left and right` `// pointers.` `struct` `node* newNode(``int` `data)` `{` `    ``struct` `node* node = (``struct` `node*)``malloc``(` `        ``sizeof``(``struct` `node));` `    ``node->data = data;` `    ``node->left = NULL;` `    ``node->right = NULL;` `    ``return``(node);` `}`   `// Driver code` `int` `main()` `{` `    ``struct` `node *root = newNode(26);` `    ``root->left = newNode(10);` `    ``root->right = newNode(3);` `    ``root->left->left = newNode(4);` `    ``root->left->right = newNode(6);` `    ``root->right->right = newNode(3);` `    `  `    ``if` `(isSumTree(root))` `        ``cout << ``"The given tree is a SumTree "``;` `    ``else` `        ``cout << ``"The given tree is not a SumTree "``;`   `    ``getchar``();` `    ``return` `0;` `}`   `// This code is contributed by khushboogoyal499`

## C

 `// C program to check if Binary tree` `// is sum tree or not` `#include ` `#include `   `/* A binary tree node has data, left child and right child */` `struct` `node` `{` `    ``int` `data;` `    ``struct` `node* left;` `    ``struct` `node* right;` `};`   `/* A utility function to get the sum of values in tree with root` `  ``as root */` `int` `sum(``struct` `node *root)` `{` `   ``if``(root == NULL)` `     ``return` `0;` `   ``return` `sum(root->left) + root->data + sum(root->right);` `}`   `/* returns 1 if sum property holds for the given` `    ``node and both of its children */` `int` `isSumTree(``struct` `node* node)` `{` `    ``int` `ls, rs;`   `    ``/* If node is NULL or it's a leaf node then` `       ``return true */` `    ``if``(node == NULL ||` `            ``(node->left == NULL && node->right == NULL))` `        ``return` `1;`   `   ``/* Get sum of nodes in left and right subtrees */` `   ``ls = sum(node->left);` `   ``rs = sum(node->right);`   `   ``/* if the node and both of its children satisfy the` `       ``property return 1 else 0*/` `    ``if``((node->data == ls + rs)&&` `            ``isSumTree(node->left) &&` `            ``isSumTree(node->right))` `        ``return` `1;`   `   ``return` `0;` `}`   `/*` ` ``Helper function that allocates a new node` ` ``with the given data and NULL left and right` ` ``pointers.` `*/` `struct` `node* newNode(``int` `data)` `{` `    ``struct` `node* node =` `        ``(``struct` `node*)``malloc``(``sizeof``(``struct` `node));` `    ``node->data = data;` `    ``node->left = NULL;` `    ``node->right = NULL;` `    ``return``(node);` `}`   `/* Driver program to test above function */` `int` `main()` `{` `    ``struct` `node *root  = newNode(26);` `    ``root->left         = newNode(10);` `    ``root->right        = newNode(3);` `    ``root->left->left   = newNode(4);` `    ``root->left->right  = newNode(6);` `    ``root->right->right = newNode(3);` `    ``if``(isSumTree(root))` `        ``printf``(``"The given tree is a SumTree."``);` `    ``else` `        ``printf``(``"The given tree is not a SumTree."``);`   `    ``getchar``();` `    ``return` `0;` `}`

## Java

 `// Java program to check if Binary tree` `// is sum tree or not` `import` `java.io.*;`   `// A binary tree node has data, ` `// left child and right child` `class` `Node` `{` `    ``int` `data;` `    ``Node left, right, nextRight;` `  `  `    ``// Helper function that allocates a new node` `    ``// with the given data and NULL left and right` `    ``// pointers.` `    ``Node(``int` `item) ` `    ``{` `        ``data = item;` `        ``left = right = ``null``;` `    ``}` `}` `class` `BinaryTree {` `    ``public` `static` `Node root;` `  `  `    ``// A utility function to get the sum` `    ``// of values in tree with root as root ` `    ``static` `int` `sum(Node node)` `    ``{` `        ``if``(node == ``null``)` `        ``{` `            ``return` `0``;` `        ``}` `        ``return` `(sum(node.left) + node.data+sum(node.right));` `    ``}` `  `  `    ``// Returns 1 if sum property holds for` `    ``// the given node and both of its children ` `    ``static` `int` `isSumTree(Node node)` `    ``{` `        ``int` `ls,rs;` `      `  `        ``// If node is NULL or it's a leaf` `        ``// node then return true ` `        ``if``(node == ``null` `|| (node.left == ``null` `&& node.right == ``null``))` `        ``{` `            ``return` `1``;` `        ``}` `      `  `        ``// Get sum of nodes in left and` `        ``// right subtrees ` `        ``ls = sum(node.left);` `        ``rs = sum(node.right);` `      `  `        ``// If the node and both of its ` `        ``// children satisfy the property ` `        ``// return 1 else 0` `        ``if``((node.data == ls + rs) && isSumTree(node.left) != ``0` `&& isSumTree(node.right) != ``0``)` `        ``{` `            ``return` `1``;` `        ``}` `        ``return` `0``;` `    ``}` `  `  `    ``// Driver code` `    ``public` `static` `void` `main (String[] args)` `    ``{` `        ``BinaryTree tree=``new` `BinaryTree();` `        ``tree.root=``new` `Node(``26``);` `        ``tree.root.left=``new` `Node(``10``);` `        ``tree.root.right=``new` `Node(``3``);` `        ``tree.root.left.left=``new` `Node(``4``);` `        ``tree.root.left.right=``new` `Node(``6``);` `        ``tree.root.right.right=``new` `Node(``3``);` `        ``if``(isSumTree(root) != ``0``)` `        ``{` `            ``System.out.println(``"The given tree is a SumTree"``);` `        ``}` `        ``else` `        ``{` `            ``System.out.println(``"The given tree is not a SumTree"``);` `        ``}` `    ``}` `}`   `// This code is contributed by rag2127`

## Python3

 `# Python3 program to implement ` `# the above approach`   `# A binary tree node has data, ` `# left child and right child` `class` `node:` `  `  `    ``def` `__init__(``self``, x):` `      `  `        ``self``.data ``=` `x` `        ``self``.left ``=` `None` `        ``self``.right ``=` `None`   `# A utility function to get the sum` `# of values in tree with root as root ` `def` `sum``(root):` `  `  `    ``if``(root ``=``=` `None``):` `        ``return` `0` `    ``return` `(``sum``(root.left) ``+` `            ``root.data ``+` `            ``sum``(root.right))`   `# returns 1 if sum property holds ` `# for the given node and both of ` `# its children ` `def` `isSumTree(node):` `  `  `    ``# ls, rs`   `    ``# If node is None or it's a leaf ` `    ``# node then return true` `    ``if``(node ``=``=` `None` `or` `      ``(node.left ``=``=` `None` `and` `       ``node.right ``=``=` `None``)):` `        ``return` `1`   `    ``# Get sum of nodes in left and ` `    ``# right subtrees ` `    ``ls ``=` `sum``(node.left)` `    ``rs ``=` `sum``(node.right)`   `    ``# if the node and both of its children` `    ``# satisfy the property return 1 else 0` `    ``if``((node.data ``=``=` `ls ``+` `rs) ``and` `        ``isSumTree(node.left) ``and` `        ``isSumTree(node.right)):` `        ``return` `1`   `    ``return` `0`   `# Driver code` `if` `__name__ ``=``=` `'__main__'``:` `  `  `    ``root ``=` `node(``26``)` `    ``root.left``=` `node(``10``)` `    ``root.right ``=` `node(``3``)` `    ``root.left.left ``=` `node(``4``)` `    ``root.left.right ``=` `node(``6``)` `    ``root.right.right ``=` `node(``3``)` `    `  `    ``if``(isSumTree(root)):` `        ``print``(``"The given tree is a SumTree "``)` `    ``else``:` `        ``print``(``"The given tree is not a SumTree "``)`   `# This code is contributed by Mohit Kumar 29`

## C#

 `// C# program to check if Binary tree` `// is sum tree or not` `using` `System;` ` `  `// A binary tree node has data, ` `// left child and right child` `public` `class` `Node` `{` `    ``public` `int` `data;` `    ``public` `Node left, right, nextRight;` `   `  `    ``// Helper function that allocates a new node` `    ``// with the given data and NULL left and right` `    ``// pointers.` `    ``public` `Node(``int` `item) ` `    ``{` `        ``data = item;` `        ``left = right = ``null``;` `    ``}` `}`   `class` `BinaryTree {` `    `  `    ``public` `Node root;` `   `  `    ``// A utility function to get the sum` `    ``// of values in tree with root as root ` `    ``int` `sum(Node node)` `    ``{` `        ``if``(node == ``null``)` `        ``{` `            ``return` `0;` `        ``}` `        ``return` `(sum(node.left) + node.data+sum(node.right));` `    ``}` `   `  `    ``// Returns 1 if sum property holds for` `    ``// the given node and both of its children ` `    ``int` `isSumTree(Node node)` `    ``{` `        ``int` `ls,rs;` `       `  `        ``// If node is NULL or it's a leaf` `        ``// node then return true ` `        ``if``(node == ``null` `|| (node.left == ``null` `&& node.right == ``null``))` `        ``{` `            ``return` `1;` `        ``}` `       `  `        ``// Get sum of nodes in left and` `        ``// right subtrees ` `        ``ls = sum(node.left);` `        ``rs = sum(node.right);` `       `  `        ``// If the node and both of its ` `        ``// children satisfy the property ` `        ``// return 1 else 0` `        ``if``((node.data == ls + rs) && isSumTree(node.left) != 0 && isSumTree(node.right) != 0)` `        ``{` `            ``return` `1;` `        ``}` `        ``return` `0;` `    ``}` `   `  `    ``// Driver code` `    ``public` `static` `void` `Main(``string``[] args)` `    ``{` `        ``BinaryTree tree = ``new` `BinaryTree();` `        ``tree.root = ``new` `Node(26);` `        ``tree.root.left = ``new` `Node(10);` `        ``tree.root.right = ``new` `Node(3);` `        ``tree.root.left.left = ``new` `Node(4);` `        ``tree.root.left.right = ``new` `Node(6);` `        ``tree.root.right.right = ``new` `Node(3);` `        ``if``(tree.isSumTree(tree.root) != 0)` `        ``{` `            ``Console.WriteLine(``"The given tree is a SumTree"``);` `        ``}` `        ``else` `        ``{` `            ``Console.WriteLine(``"The given tree is not a SumTree"``);` `        ``}` `    ``}` `}` ` `  `// This code is contributed by Pratham76`

## Javascript

 ``

Output

`The given tree is a SumTree`

Time Complexity: O(n2) in the worst case. The worst-case occurs for a skewed tree.

Auxiliary Space: O(n) for stack space

Method 2 (Tricky)
Method 1 uses sum() to get the sum of nodes in left and right subtrees. Method 2 uses the following rules to get the sum directly.
1) If the node is a leaf node then the sum of the subtree rooted with this node is equal to the value of this node.
2) If the node is not a leaf node then the sum of the subtree rooted with this node is twice the value of this node (Assuming that the tree rooted with this node is SumTree).

## C++

 `// C++ program to check if Binary tree` `// is sum tree or not` `#include` `using` `namespace` `std;`   `/* A binary tree node has data, ` `   ``left child and right child */` `struct` `node` `{` `    ``int` `data;` `    ``node* left;` `    ``node* right;` `};`   `/* Utility function to check if ` `the given node is leaf or not */` `int` `isLeaf(node *node)` `{` `    ``if``(node == NULL)` `        ``return` `0;` `    ``if``(node->left == NULL && node->right == NULL)` `        ``return` `1;` `    ``return` `0;` `}`   `/* returns 1 if SumTree property holds for the given` `    ``tree */` `int` `isSumTree(node* node)` `{` `    ``int` `ls; ``// for sum of nodes in left subtree` `    ``int` `rs; ``// for sum of nodes in right subtree`   `    ``/* If node is NULL or it's a leaf node then` `       ``return true */` `    ``if``(node == NULL || isLeaf(node))` `        ``return` `1;`   `    ``if``( isSumTree(node->left) && isSumTree(node->right))` `    ``{` `      `  `        ``// Get the sum of nodes in left subtree` `        ``if``(node->left == NULL)` `            ``ls = 0;` `        ``else` `if``(isLeaf(node->left))` `            ``ls = node->left->data;` `        ``else` `            ``ls = 2 * (node->left->data);`   `        ``// Get the sum of nodes in right subtree` `        ``if``(node->right == NULL)` `            ``rs = 0;` `        ``else` `if``(isLeaf(node->right))` `            ``rs = node->right->data;` `        ``else` `            ``rs = 2 * (node->right->data);`   `        ``/* If root's data is equal to sum of nodes in left` `           ``and right subtrees then return 1 else return 0*/` `        ``return``(node->data == ls + rs);` `    ``}` `    ``return` `0;` `}`   `/* Helper function that allocates a new node` ` ``with the given data and NULL left and right` ` ``pointers.` `*/` `node* newNode(``int` `data)` `{` `    ``node* node1 = ``new` `node();` `    ``node1->data = data;` `    ``node1->left = NULL;` `    ``node1->right = NULL;` `    ``return``(node1);` `}`   `/* Driver code */` `int` `main()` `{` `    ``node *root  = newNode(26);` `    ``root->left = newNode(10);` `    ``root->right = newNode(3);` `    ``root->left->left = newNode(4);` `    ``root->left->right = newNode(6);` `    ``root->right->right = newNode(3);` `    ``if``(isSumTree(root))` `        ``cout << ``"The given tree is a SumTree "``;` `    ``else` `        ``cout << ``"The given tree is not a SumTree "``;` `    ``return` `0;` `}`   `// This code is contributed by rutvik_56`

## C

 `// C program to check if Binary tree` `// is sum tree or not` `#include ` `#include `   `/* A binary tree node has data, ` `   ``left child and right child */` `struct` `node` `{` `    ``int` `data;` `    ``struct` `node* left;` `    ``struct` `node* right;` `};`   `/* Utility function to check if the given node is leaf or not */` `int` `isLeaf(``struct` `node *node)` `{` `    ``if``(node == NULL)` `        ``return` `0;` `    ``if``(node->left == NULL && node->right == NULL)` `        ``return` `1;` `    ``return` `0;` `}`   `/* returns 1 if SumTree property holds for the given` `    ``tree */` `int` `isSumTree(``struct` `node* node)` `{` `    ``int` `ls; ``// for sum of nodes in left subtree` `    ``int` `rs; ``// for sum of nodes in right subtree`   `    ``/* If node is NULL or it's a leaf node then` `       ``return true */` `    ``if``(node == NULL || isLeaf(node))` `        ``return` `1;`   `    ``if``( isSumTree(node->left) && isSumTree(node->right))` `    ``{` `        ``// Get the sum of nodes in left subtree` `        ``if``(node->left == NULL)` `            ``ls = 0;` `        ``else` `if``(isLeaf(node->left))` `            ``ls = node->left->data;` `        ``else` `            ``ls = 2*(node->left->data);`   `        ``// Get the sum of nodes in right subtree` `        ``if``(node->right == NULL)` `            ``rs = 0;` `        ``else` `if``(isLeaf(node->right))` `            ``rs = node->right->data;` `        ``else` `            ``rs = 2*(node->right->data);`   `        ``/* If root's data is equal to sum of nodes in left` `           ``and right subtrees then return 1 else return 0*/` `        ``return``(node->data == ls + rs);` `    ``}`   `    ``return` `0;` `}`   `/* Helper function that allocates a new node` ` ``with the given data and NULL left and right` ` ``pointers.` `*/` `struct` `node* newNode(``int` `data)` `{` `    ``struct` `node* node =` `        ``(``struct` `node*)``malloc``(``sizeof``(``struct` `node));` `    ``node->data = data;` `    ``node->left = NULL;` `    ``node->right = NULL;` `    ``return``(node);` `}`   `/* Driver program to test above function */` `int` `main()` `{` `    ``struct` `node *root  = newNode(26);` `    ``root->left         = newNode(10);` `    ``root->right        = newNode(3);` `    ``root->left->left   = newNode(4);` `    ``root->left->right  = newNode(6);` `    ``root->right->right = newNode(3);` `    ``if``(isSumTree(root))` `        ``printf``(``"The given tree is a SumTree "``);` `    ``else` `        ``printf``(``"The given tree is not a SumTree "``);`   `    ``getchar``();` `    ``return` `0;` `}`

## Java

 `// Java program to check if Binary tree is sum tree or not` ` `    `/* A binary tree node has data, left child and right child */` `class` `Node ` `{` `    ``int` `data;` `    ``Node left, right, nextRight;` ` `  `    ``Node(``int` `item) ` `    ``{` `        ``data = item;` `        ``left = right = nextRight = ``null``;` `    ``}` `}` ` `  `class` `BinaryTree ` `{` `    ``Node root;` ` `  `    ``/* Utility function to check if the given node is leaf or not */` `    ``int` `isLeaf(Node node) ` `    ``{` `        ``if` `(node == ``null``)` `            ``return` `0``;` `        ``if` `(node.left == ``null` `&& node.right == ``null``)` `            ``return` `1``;` `        ``return` `0``;` `    ``}` ` `  `    ``/* returns 1 if SumTree property holds for the given` `       ``tree */` `    ``int` `isSumTree(Node node) ` `    ``{` `        ``int` `ls; ``// for sum of nodes in left subtree` `        ``int` `rs; ``// for sum of nodes in right subtree` ` `  `        ``/* If node is NULL or it's a leaf node then` `         ``return true */` `        ``if` `(node == ``null` `|| isLeaf(node) == ``1``)` `            ``return` `1``;` ` `  `        ``if` `(isSumTree(node.left) != ``0` `&& isSumTree(node.right) != ``0``) ` `        ``{` `            ``// Get the sum of nodes in left subtree` `            ``if` `(node.left == ``null``)` `                ``ls = ``0``;` `            ``else` `if` `(isLeaf(node.left) != ``0``)` `                ``ls = node.left.data;` `            ``else` `                ``ls = ``2` `* (node.left.data);` ` `  `            ``// Get the sum of nodes in right subtree` `            ``if` `(node.right == ``null``)` `                ``rs = ``0``;` `            ``else` `if` `(isLeaf(node.right) != ``0``)` `                ``rs = node.right.data;` `            ``else` `                ``rs = ``2` `* (node.right.data);` `             `  `            ``/* If root's data is equal to sum of nodes in left` `               ``and right subtrees then return 1 else return 0*/` `            ``if` `((node.data == rs + ls))` `                ``return` `1``;` `            ``else` `                ``return` `0``;` `        ``}` ` `  `        ``return` `0``;` `    ``}` ` `  `    ``/* Driver program to test above functions */` `    ``public` `static` `void` `main(String args[]) ` `    ``{` `        ``BinaryTree tree = ``new` `BinaryTree();` `        ``tree.root = ``new` `Node(``26``);` `        ``tree.root.left = ``new` `Node(``10``);` `        ``tree.root.right = ``new` `Node(``3``);` `        ``tree.root.left.left = ``new` `Node(``4``);` `        ``tree.root.left.right = ``new` `Node(``6``);` `        ``tree.root.right.right = ``new` `Node(``3``);` ` `  `        ``if` `(tree.isSumTree(tree.root) != ``0``)` `            ``System.out.println(``"The given tree is a SumTree"``);` `        ``else` `            ``System.out.println(``"The given tree is not a SumTree"``);` `    ``}` `}`   `// This code has been contributed by Mayank Jaiswal`

## Python3

 `# Python3 program to check if` `# Binary tree is sum tree or not`   `# A binary tree node has data,` `# left child and right child` `class` `node:`   `    ``def` `__init__(``self``, x):`   `        ``self``.data ``=` `x` `        ``self``.left ``=` `None` `        ``self``.right ``=` `None`     `def` `isLeaf(node):`   `    ``if``(node ``=``=` `None``):` `        ``return` `0` `    ``if``(node.left ``=``=` `None` `and` `node.right ``=``=` `None``):` `        ``return` `1` `    ``return` `0`   `# A utility function to get the sum` `# of values in tree with root as root` `def` `sum``(root):`   `    ``if``(root ``=``=` `None``):` `        ``return` `0` `    ``return` `(``sum``(root.left) ``+` `            ``root.data ``+` `            ``sum``(root.right))`     `# returns 1 if SumTree property holds` `# for the given tree` `def` `isSumTree(node):` `  `  `    ``# If node is None or` `    ``# it's a leaf node then return true` `    ``if``(node ``=``=` `None` `or` `isLeaf(node)):` `        ``return` `1`   `    ``if``(isSumTree(node.left) ``and` `isSumTree(node.right)):` `      `  `        ``# Get the sum of nodes in left subtree` `        ``if``(node.left ``=``=` `None``):` `            ``ls ``=` `0` `        ``elif``(isLeaf(node.left)):` `            ``ls ``=` `node.left.data` `        ``else``:` `            ``ls ``=` `2` `*` `(node.left.data)`   `        ``# Get the sum of nodes in right subtree` `        ``if``(node.right ``=``=` `None``):` `            ``rs ``=` `0` `        ``elif``(isLeaf(node.right)):` `            ``rs ``=` `node.right.data` `        ``else``:` `            ``rs ``=` `2` `*` `(node.right.data)`   `        ``# If root's data is equal to sum of nodes` `        ``# in left and right subtrees then return 1` `        ``# else return 0` `        ``return``(node.data ``=``=` `ls ``+` `rs)`   `    ``return` `0`   `# Driver code` `if` `__name__ ``=``=` `'__main__'``:`   `    ``root ``=` `node(``26``)` `    ``root.left ``=` `node(``10``)` `    ``root.right ``=` `node(``3``)` `    ``root.left.left ``=` `node(``4``)` `    ``root.left.right ``=` `node(``6``)` `    ``root.right.right ``=` `node(``3``)`   `    ``if``(isSumTree(root)):` `        ``print``(``"The given tree is a SumTree "``)` `    ``else``:` `        ``print``(``"The given tree is not a SumTree "``)`   `# This code is contributed by kirtishsurangalikar`

## C#

 `// C# program to check if Binary tree` `// is sum tree or not` `using` `System;`   `// A binary tree node has data, left` `// child and right child` `public` `class` `Node ` `{ ` `    ``public` `int` `data; ` `    ``public` `Node left, right, nextRight; ` ` `  `    ``public` `Node(``int` `d) ` `    ``{ ` `        ``data = d; ` `        ``left = right = nextRight = ``null``; ` `    ``} ` `} `   `public` `class` `BinaryTree{` `    `  `public` `static` `Node root;`   `// Utility function to check if` `// the given node is leaf or not ` `public` `int` `isLeaf(Node node) ` `{` `    ``if` `(node == ``null``)` `        ``return` `0;` `        `  `    ``if` `(node.left == ``null` `&&` `        ``node.right == ``null``)` `        ``return` `1;` `        `  `    ``return` `0;` `}`   `// Returns 1 if SumTree property holds` `// for the given tree ` `public` `int` `isSumTree(Node node) ` `{` `    `  `    ``// For sum of nodes in left subtree` `    ``int` `ls; ` `    `  `    ``// For sum of nodes in right subtree` `    ``int` `rs; `   `    ``// If node is NULL or it's a leaf ` `    ``// node then return true ` `    ``if` `(node == ``null` `|| isLeaf(node) == 1)` `        ``return` `1;`   `    ``if` `(isSumTree(node.left) != 0 && ` `       ``isSumTree(node.right) != 0) ` `    ``{` `        `  `        ``// Get the sum of nodes in left subtree` `        ``if` `(node.left == ``null``)` `            ``ls = 0;` `        ``else` `if` `(isLeaf(node.left) != 0)` `            ``ls = node.left.data;` `        ``else` `            ``ls = 2 * (node.left.data);`   `        ``// Get the sum of nodes in right subtree` `        ``if` `(node.right == ``null``)` `            ``rs = 0;` `        ``else` `if` `(isLeaf(node.right) != 0)` `            ``rs = node.right.data;` `        ``else` `            ``rs = 2 * (node.right.data);` `          `  `        ``// If root's data is equal to sum of ` `        ``// nodes in left and right subtrees` `        ``// then return 1 else return 0` `        ``if` `((node.data == rs + ls))` `            ``return` `1;` `        ``else` `            ``return` `0;` `    ``}`   `    ``return` `0;` `}`   `// Driver code` `static` `public` `void` `Main()` `{` `    ``BinaryTree tree = ``new` `BinaryTree();` `    ``BinaryTree.root = ``new` `Node(26);` `    ``BinaryTree.root.left = ``new` `Node(10);` `    ``BinaryTree.root.right = ``new` `Node(3);` `    ``BinaryTree.root.left.left = ``new` `Node(4);` `    ``BinaryTree.root.left.right = ``new` `Node(6);` `    ``BinaryTree.root.right.right = ``new` `Node(3);` `    `  `    ``if` `(tree.isSumTree(BinaryTree.root) != 0)` `    ``{` `        ``Console.WriteLine(``"The given tree is a SumTree"``);` `    ``}` `    ``else` `    ``{` `        ``Console.WriteLine(``"The given tree is "` `+` `                          ``"not a SumTree"``);` `    ``}` `}` `}`   `// This code is contributed by avanitrachhadiya2155`

## Javascript

 ``

Output:

`The given tree is a SumTree`

Time Complexity: O(n)

Auxiliary Space: O(n)

#### Method 3

1. Similar to postorder traversal iteratively find the sum in each step
2. Return left + right + current data if left + right is equal to current node data
3. Else return -1

## C++

 `// C++ program to check if Binary tree` `// is sum tree or not` `#include` `using` `namespace` `std;`   `/* A binary tree node has data,` `left child and right child */` `struct` `node` `{` `    ``int` `data;` `    ``node* left;` `    ``node* right;` `};`   `/* Utility function to check if` `the given node is leaf or not */` `int` `isLeaf(node *node)` `{` `    ``if``(node == NULL)` `        ``return` `0;` `    ``if``(node->left == NULL && node->right == NULL)` `        ``return` `1;` `    ``return` `0;` `}`   `/* returns data if SumTree property holds for the given` `    ``tree else return -1*/` `int` `isSumTree(node* node)` `{` `    ``if``(node == NULL)` `    ``return` `0;` `    `  `    ``int` `ls; ``// for sum of nodes in left subtree` `    ``int` `rs; ``// for sum of nodes in right subtree` `    `  `    `  `    ``ls = isSumTree(node->left);` `    ``if``(ls == -1)            ``// To stop for further traversal of tree if found not sumTree` `    ``return` `-1;` `    `  `    ``rs = isSumTree(node->right);` `    ``if``(rs == -1)            ``// To stop for further traversal of tree if found not sumTree` `    ``return` `-1;` `    `  `    `  `    ``if``(isLeaf(node) || ls + rs == node->data)` `    ``return` `ls + rs + node->data;` `    ``else` `    ``return` `-1;` ` `  `}`   `/* Helper function that allocates a new node` `with the given data and NULL left and right` `pointers.` `*/` `node* newNode(``int` `data)` `{` `    ``node* node1 = ``new` `node();` `    ``node1->data = data;` `    ``node1->left = NULL;` `    ``node1->right = NULL;` `    ``return``(node1);` `}`   `/* Driver code */` `int` `main()` `{` `    ``node *root = newNode(26);` `    ``root->left = newNode(10);` `    ``root->right = newNode(3);` `    ``root->left->left = newNode(4);` `    ``root->left->right = newNode(6);` `    ``root->right->right = newNode(3);` `    `  `    ``int` `total = isSumTree(root);` `    ``if``(total != -1 && total == 2*(root->data))` `    ``cout<<``"Tree is a Sum Tree"``;` `    ``else` `    ``cout<<``"Given Tree is not sum Tree"``;` `    `  `    ``return` `0;` `}`   `// This code is contributed by Mugunthan`

## C++14

 `// C++ program to check if Binary tree` `// is sum tree or not` `#include` `using` `namespace` `std;`   `/* A binary tree node has data,` `left child and right child */` `struct` `node` `{` `    ``int` `data;` `    ``node* left;` `    ``node* right;` `};`   `/* Utility function to check if` `the given node is leaf or not */` `int` `isLeaf(node *node)` `{` `    ``if``(node == NULL)` `        ``return` `0;` `    ``if``(node->left == NULL && node->right == NULL)` `        ``return` `1;` `    ``return` `0;` `}`   `/* returns data if SumTree property holds for the given` `    ``tree else return -1*/` `int` `isSumTree(node* node)` `{` `    ``if``(node == NULL)` `    ``return` `0;` `    `  `    ``int` `ls; ``// for sum of nodes in left subtree` `    ``int` `rs; ``// for sum of nodes in right subtree` `    `  `    `  `    ``ls = isSumTree(node->left);` `    ``if``(ls == -1)            ``// To stop for further traversal of tree if found not sumTree` `    ``return` `-1;` `    `  `    ``rs = isSumTree(node->right);` `    ``if``(rs == -1)            ``// To stop for further traversal of tree if found not sumTree` `    ``return` `-1;` `    `  `    `  `    ``if``(isLeaf(node) || ls + rs == node->data)` `    ``return` `ls + rs + node->data;` `    ``else` `    ``return` `-1;` ` `  `}`   `/* Helper function that allocates a new node` `with the given data and NULL left and right` `pointers.` `*/` `node* newNode(``int` `data)` `{` `    ``node* node1 = ``new` `node();` `    ``node1->data = data;` `    ``node1->left = NULL;` `    ``node1->right = NULL;` `    ``return``(node1);` `}`   `/* Driver code */` `int` `main()` `{` `    ``node *root = newNode(26);` `    ``root->left = newNode(10);` `    ``root->right = newNode(3);` `    ``root->left->left = newNode(4);` `    ``root->left->right = newNode(6);` `    ``root->right->right = newNode(3);` `    `  `    ``int` `total = isSumTree(root);` `    ``if``(total != -1 && total == 2*(root->data))` `    ``cout<<``"Sum Tree"``;` `    ``else` `    ``cout<<``"No sum Tree"``;` `    `  `    ``return` `0;` `}`   `// This code is contributed by Mugunthan`

## Java

 `// Java program to check if Binary tree` `// is sum tree or not`   `import` `java.util.*;`   `class` `GFG` `{` `/* A binary tree node has data,` `left child and right child */`   `static` `class` `Node {` `int` `data;` `Node left, right;`   `}`   `/* Utility function to check if` `the given node is leaf or not */` `static` `int` `isLeaf(Node node)` `{` `    ``if``(node == ``null``)` `        ``return` `0``;` `    ``if``(node.left == ``null` `&& node.right == ``null``)` `        ``return` `1``;` `    ``return` `0``;` `}`   `/* returns data if SumTree property holds for the given` `    ``tree else return -1*/` `static` `int` `isSumTree(Node node)` `{` `    ``if``(node == ``null``)` `    ``return` `0``;` `    `  `    ``int` `ls; ``// for sum of nodes in left subtree` `    ``int` `rs; ``// for sum of nodes in right subtree` `    `  `    `  `    ``ls = isSumTree(node.left);` `    ``if``(ls == -``1``)            ``// To stop for further traversal of tree if found not sumTree` `    ``return` `-``1``;` `    `  `    ``rs = isSumTree(node.right);` `    ``if``(rs == -``1``)            ``// To stop for further traversal of tree if found not sumTree` `    ``return` `-``1``;` `    `  `    `  `    ``if``(isLeaf(node)==``1` `|| ls + rs == node.data)` `    ``return` `ls + rs + node.data;` `    ``else` `    ``return` `-``1``;` ` `  `}`   `/* Helper function that allocates a new node` `with the given data and null left and right` `pointers.` `*/` `static` `Node newNode(``int` `data)` `{` `    ``Node node1 = ``new` `Node();` `    ``node1.data = data;` `    ``node1.left = ``null``;` `    ``node1.right = ``null``;` `    ``return``(node1);` `}`   `public` `static` `void` `main(String args[])` `{` `    ``Node root = newNode(``26``);` `    ``root.left = newNode(``10``);` `    ``root.right = newNode(``3``);` `    ``root.left.left = newNode(``4``);` `    ``root.left.right = newNode(``6``);` `    ``root.right.right = newNode(``3``);` `    `  `    ``int` `total = isSumTree(root);` `    ``if``(total != -``1` `&& total == ``2``*(root.data))` `    ``System.out.print(``"Tree is a Sum Tree"``);` `    ``else` `     ``System.out.print(``"Given Tree is not sum Tree"``);` `}` `}`   `// This code is contributed by jana_sayantan.`

## Python3

 `# Python3 program to check if` `# Binary tree is sum tree or not` ` `  `# A binary tree node has data,` `# left child and right child` `class` `node:` ` `  `    ``def` `__init__(``self``, x):` ` `  `        ``self``.data ``=` `x` `        ``self``.left ``=` `None` `        ``self``.right ``=` `None` ` `  ` `  `def` `isLeaf(node):` ` `  `    ``if``(node ``=``=` `None``):` `        ``return` `0` `    ``if``(node.left ``=``=` `None` `and` `node.right ``=``=` `None``):` `        ``return` `1` `    ``return` `0` ` `    `# returns data if SumTree property holds for the given` `#    tree else return -1` `def` `isSumTree(node):` `    ``if``(node ``=``=` `None``):` `        ``return` `0` `    `  `    ``ls ``=` `isSumTree(node.left)` `    ``if``(ls ``=``=` `-``1``):            ``#To stop for further traversal of tree if found not sumTree` `        ``return` `-``1` `        `  `    ``rs ``=` `isSumTree(node.right)` `    ``if``(rs ``=``=` `-``1``):            ``#To stop for further traversal of tree if found not sumTree` `        ``return` `-``1` `    `  `    `  `    ``if``(isLeaf(node) ``or` `ls ``+` `rs ``=``=` `node.data):` `        ``return` `ls ``+` `rs ``+` `node.data` `    ``else``:` `        ``return` `-``1` ` `  `# Driver code` `if` `__name__ ``=``=` `'__main__'``:` ` `  `    ``root ``=` `node(``26``)` `    ``root.left ``=` `node(``10``)` `    ``root.right ``=` `node(``3``)` `    ``root.left.left ``=` `node(``4``)` `    ``root.left.right ``=` `node(``6``)` `    ``root.right.right ``=` `node(``3``)` ` `  `    ``if``(isSumTree(root)):` `        ``print``(``"The given tree is a SumTree "``)` `    ``else``:` `        ``print``(``"The given tree is not a SumTree "``)` ` `  `# This code is contributed by Mugunthan`

## C#

 `// C# program to check if Binary tree` `// is sum tree or not` `using` `System;`   `class` `Program {` `    ``/* A binary tree node has data,` `    ``left child and right child */` `    ``public` `class` `Node {` `        ``public` `int` `data;` `        ``public` `Node left, right;` `    ``}`   `    ``/* Utility function to check if` `    ``the given node is leaf or not */` `    ``static` `int` `isLeaf(Node node)` `    ``{` `        ``if` `(node == ``null``)` `            ``return` `0;` `        ``if` `(node.left == ``null` `&& node.right == ``null``)` `            ``return` `1;` `        ``return` `0;` `    ``}`   `    ``/* returns data if SumTree property holds for the given` `    ``tree else return -1*/` `    ``static` `int` `isSumTree(Node node)` `    ``{` `        ``if` `(node == ``null``)` `            ``return` `0;`   `        ``int` `ls; ``// for sum of nodes in left subtree` `        ``int` `rs; ``// for sum of nodes in right subtree`   `        ``ls = isSumTree(node.left);` `        ``if` `(ls == -1) ``// To stop for further traversal of` `                      ``// tree if found not sumTree` `            ``return` `-1;`   `        ``rs = isSumTree(node.right);` `        ``if` `(rs == -1) ``// To stop for further traversal of` `                      ``// tree if found not sumTree` `            ``return` `-1;`   `        ``if` `(isLeaf(node) == 1 || ls + rs == node.data)` `            ``return` `ls + rs + node.data;` `        ``else` `            ``return` `-1;` `    ``}`   `    ``/* Helper function that allocates a new node` `    ``with the given data and NULL left and right` `    ``pointers.` `    ``*/` `    ``static` `Node newNode(``int` `data)` `    ``{` `        ``Node node1 = ``new` `Node();` `        ``node1.data = data;` `        ``node1.left = ``null``;` `        ``node1.right = ``null``;` `        ``return` `(node1);` `    ``}` `    ``/* Driver code */` `    ``static` `void` `Main(``string``[] args)` `    ``{` `        ``Node root = newNode(26);` `        ``root.left = newNode(10);` `        ``root.right = newNode(3);` `        ``root.left.left = newNode(4);` `        ``root.left.right = newNode(6);` `        ``root.right.right = newNode(3);` `        ``int` `total = isSumTree(root);` `        ``if` `(total != -1 && total == 2 * (root.data))` `            ``Console.WriteLine(``"Tree is a Sum Tree"``);` `        ``else` `            ``Console.WriteLine(``"Given Tree is not sum Tree"``);` `    ``}` `}`   `// This code is contributed by Tapesh(tapeshdua420)`

## Javascript

 ``

Time Complexity: O(n), since each element is traversed only once

Auxiliary Space: O(n), due to recursive stack space

My Personal Notes arrow_drop_up
Recommended Articles
Page :