# Difference between sums of odd position and even position nodes for each level of a Binary Tree

• Last Updated : 25 Jun, 2021

Given a Binary Tree, the task is to find the absolute difference between the sums of odd and even positioned nodes. A node is said to be odd and even positioned if its position in the current level is odd and even respectively. Note that the first element of each row is considered as odd positioned.
Examples:

```Input:
5
/   \
2     6
/  \     \
1    4     8
/     / \
3     7   9
Output: 11
Level     oddPositionNodeSum  evenPositionNodeSum
0             5                  0
1             2                  6
2             9                  4
3             12                 7
Difference = |(5 + 2 + 9 + 12) - (0 + 6 + 4 + 7)| = |28 - 17| = 11

Input:
5
/   \
2     3
Output: 4```

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.  To complete your preparation from learning a language to DS Algo and many more,  please refer Complete Interview Preparation Course.

In case you wish to attend live classes with experts, please refer DSA Live Classes for Working Professionals and Competitive Programming Live for Students.

Approach: To find the sum of nodes at even and odd positions level by level, use level order traversal. While traversing the tree level by level mark flag oddPosition as true for the first element of each row and switch it for each next element of the same row. And in case if oddPosition flag is true add the node data into oddPositionNodeSum else add node data to evenPositionNodeSum. After completion of tree traversal find the absolute value of their differences at the end of the tree traversal.
Below is the implementation of the above approach:

## C++

 `// C++ implementation of the approach``#include ``using` `namespace` `std;` `struct` `Node {``    ``int` `data;``    ``Node *left, *right;``};` `// Iterative method to perform level``// order traversal line by line``int` `nodeSumDiff(Node* root)``{` `    ``// Base Case``    ``if` `(root == NULL)``        ``return` `0;` `    ``int` `evenPositionNodeSum = 0;``    ``int` `oddPositionNodeSum = 0;` `    ``// Create an empty queue for level``    ``// order traversal``    ``queue q;` `    ``// Enqueue root element``    ``q.push(root);` `    ``while` `(1) {` `        ``// nodeCount (queue size) indicates``        ``// number of nodes in the current level``        ``int` `nodeCount = q.size();``        ``if` `(nodeCount == 0)``            ``break``;` `        ``// Mark 1st node as even positioned``        ``bool` `oddPosition = ``true``;` `        ``// Dequeue all the nodes of current level``        ``// and Enqueue all the nodes of next level``        ``while` `(nodeCount > 0) {``            ``Node* node = q.front();` `            ``// Depending upon node position``            ``// add value to their respective sum``            ``if` `(oddPosition)``                ``oddPositionNodeSum += node->data;``            ``else``                ``evenPositionNodeSum += node->data;` `            ``q.pop();``            ``if` `(node->left != NULL)``                ``q.push(node->left);``            ``if` `(node->right != NULL)``                ``q.push(node->right);``            ``nodeCount--;` `            ``// Switch the even position flag``            ``oddPosition = !oddPosition;``        ``}``    ``}` `    ``// Return the absolute difference``    ``return` `abs``(oddPositionNodeSum - evenPositionNodeSum);``}` `// Utility method to create a node``struct` `Node* newNode(``int` `data)``{``    ``struct` `Node* node = ``new` `Node;``    ``node->data = data;``    ``node->left = node->right = NULL;``    ``return` `(node);``}` `// Driver code``int` `main()``{``    ``struct` `Node* root = newNode(1);``    ``root->left = newNode(2);``    ``root->right = newNode(3);``    ``root->left->left = newNode(4);``    ``root->left->right = newNode(5);``    ``root->right->left = newNode(6);``    ``root->right->right = newNode(7);``    ``root->left->right->left = newNode(8);``    ``root->left->right->right = newNode(9);``    ``root->left->right->right->right = newNode(10);` `    ``cout << nodeSumDiff(root);` `    ``return` `0;``}`

## Java

 `// Java implementation of the approach``import` `java.util.*;` `class` `GFG``{` `    ``static` `class` `Node``    ``{``        ``int` `data;``        ``Node left, right;``    ``};` `    ``// Iterative method to perform level``    ``// order traversal line by line``    ``static` `int` `nodeSumDiff(Node root)``    ``{` `        ``// Base Case``        ``if` `(root == ``null``)``            ``return` `0``;` `        ``int` `evenPositionNodeSum = ``0``;``        ``int` `oddPositionNodeSum = ``0``;` `        ``// Create an empty queue for level``        ``// order traversal``        ``Queue q = ``new` `LinkedList<>();` `        ``// Enqueue root element``        ``q.add(root);` `        ``while` `(``1` `== ``1``)``        ``{` `            ``// nodeCount (queue size) indicates``            ``// number of nodes in the current level``            ``int` `nodeCount = q.size();``            ``if` `(nodeCount == ``0``)``                ``break``;` `            ``// Mark 1st node as even positioned``            ``boolean` `oddPosition = ``true``;` `            ``// Dequeue all the nodes of current level``            ``// and Enqueue all the nodes of next level``            ``while` `(nodeCount > ``0``)``            ``{``                ``Node node = q.peek();` `                ``// Depending upon node position``                ``// add value to their respective sum``                ``if` `(oddPosition)``                    ``oddPositionNodeSum += node.data;``                ``else``                    ``evenPositionNodeSum += node.data;` `                ``q.remove();``                ``if` `(node.left != ``null``)``                    ``q.add(node.left);``                ``if` `(node.right != ``null``)``                    ``q.add(node.right);``                ``nodeCount--;` `                ``// Switch the even position flag``                ``oddPosition = !oddPosition;``            ``}``        ``}` `        ``// Return the absolute difference``        ``return` `Math.abs(oddPositionNodeSum - evenPositionNodeSum);``    ``}` `    ``// Utility method to create a node``    ``static` `Node newNode(``int` `data)``    ``{``        ``Node node = ``new` `Node();``        ``node.data = data;``        ``node.left = node.right = ``null``;``        ``return` `(node);``    ``}` `    ``// Driver code``    ``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.left = newNode(``6``);``        ``root.right.right = newNode(``7``);``        ``root.left.right.left = newNode(``8``);``        ``root.left.right.right = newNode(``9``);``        ``root.left.right.right.right = newNode(``10``);` `        ``System.out.print(nodeSumDiff(root));` `    ``}``}` `// This code is contributed by PrinciRaj1992`

## Python

 `# Python implementation of the approach` `# Node of a linked list``class` `Node:``    ``def` `__init__(``self``, data ``=` `None``,``                ``left ``=` `None``, right ``=` `None``):``        ``self``.left ``=` `left``        ``self``.right ``=` `right``        ``self``.data ``=` `data` `# Iterative method to perform level``# order traversal line by line``def` `nodeSumDiff( root):` `    ``# Base Case``    ``if` `(root ``=``=` `None``):``        ``return` `0` `    ``evenPositionNodeSum ``=` `0``    ``oddPositionNodeSum ``=` `0` `    ``# Create an empty queue for level``    ``# order traversal``    ``q ``=` `[]` `    ``# Enqueue root element``    ``q.append(root)` `    ``while` `(``True``):` `        ``# nodeCount (queue size) indicates``        ``# number of nodes in the current level``        ``nodeCount ``=` `len``(q)``        ``if` `(nodeCount ``=``=` `0``):``            ``break` `        ``# Mark 1st node as even positioned``        ``oddPosition ``=` `True` `        ``# Dequeue all the nodes of current level``        ``# and Enqueue all the nodes of next level``        ``while` `(nodeCount > ``0``):``            ``node ``=` `q[``0``]` `            ``# Depending upon node position``            ``# add value to their respective sum``            ``if` `(oddPosition):``                ``oddPositionNodeSum ``+``=` `node.data``            ``else``:``                ``evenPositionNodeSum ``+``=` `node.data` `            ``q.pop(``0``)``            ``if` `(node.left !``=` `None``):``                ``q.append(node.left)``            ``if` `(node.right !``=` `None``):``                ``q.append(node.right)``            ``nodeCount ``=` `nodeCount ``-` `1` `            ``# Switch the even position flag``            ``oddPosition ``=` `not` `oddPosition``        ` `    ``# Return the absolute difference``    ``return` `abs``(oddPositionNodeSum ``-` `evenPositionNodeSum)` `# Utility method to create a node``def` `newNode(data):``    ``node ``=` `Node()``    ``node.data ``=` `data``    ``node.left ``=` `node.right ``=` `None``    ``return` `(node)` `# Driver code``root ``=` `newNode(``1``)``root.left ``=` `newNode(``2``)``root.right ``=` `newNode(``3``)``root.left.left ``=` `newNode(``4``)``root.left.right ``=` `newNode(``5``)``root.right.left ``=` `newNode(``6``)``root.right.right ``=` `newNode(``7``)``root.left.right.left ``=` `newNode(``8``)``root.left.right.right ``=` `newNode(``9``)``root.left.right.right.right ``=` `newNode(``10``)` `print``(nodeSumDiff(root))` `# This code is contributed by Arnab Kundu`

## C#

 `// C# implementation of the approach``using` `System;``using` `System.Collections.Generic;` `class` `GFG``{` `    ``public` `class` `Node``    ``{``        ``public` `int` `data;``        ``public` `Node left, right;``    ``};` `    ``// Iterative method to perform level``    ``// order traversal line by line``    ``static` `int` `nodeSumDiff(Node root)``    ``{` `        ``// Base Case``        ``if` `(root == ``null``)``            ``return` `0;` `        ``int` `evenPositionNodeSum = 0;``        ``int` `oddPositionNodeSum = 0;` `        ``// Create an empty queue for level``        ``// order traversal``        ``Queue q = ``new` `Queue();` `        ``// Enqueue root element``        ``q.Enqueue(root);` `        ``while` `(1 == 1)``        ``{` `            ``// nodeCount (queue size) indicates``            ``// number of nodes in the current level``            ``int` `nodeCount = q.Count;``            ``if` `(nodeCount == 0)``                ``break``;` `            ``// Mark 1st node as even positioned``            ``bool` `oddPosition = ``true``;` `            ``// Dequeue all the nodes of current level``            ``// and Enqueue all the nodes of next level``            ``while` `(nodeCount > 0)``            ``{``                ``Node node = q.Peek();` `                ``// Depending upon node position``                ``// add value to their respective sum``                ``if` `(oddPosition)``                    ``oddPositionNodeSum += node.data;``                ``else``                    ``evenPositionNodeSum += node.data;` `                ``q.Dequeue();``                ``if` `(node.left != ``null``)``                    ``q.Enqueue(node.left);``                ``if` `(node.right != ``null``)``                    ``q.Enqueue(node.right);``                ``nodeCount--;` `                ``// Switch the even position flag``                ``oddPosition = !oddPosition;``            ``}``        ``}` `        ``// Return the absolute difference``        ``return` `Math.Abs(oddPositionNodeSum - evenPositionNodeSum);``    ``}` `    ``// Utility method to create a node``    ``static` `Node newNode(``int` `data)``    ``{``        ``Node node = ``new` `Node();``        ``node.data = data;``        ``node.left = node.right = ``null``;``        ``return` `(node);``    ``}` `    ``// Driver code``    ``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.left = newNode(6);``        ``root.right.right = newNode(7);``        ``root.left.right.left = newNode(8);``        ``root.left.right.right = newNode(9);``        ``root.left.right.right.right = newNode(10);` `        ``Console.Write(nodeSumDiff(root));``    ``}``}` `// This code is contributed by Rajput-Ji`

## Javascript

 ``
Output:
`7`

My Personal Notes arrow_drop_up