Difference between sums of odd level and even level nodes of a Binary Tree

Hello Everyone,

Given a a Binary Tree, find the difference between the sum of nodes at odd level and the sum of nodes at even level. Consider root as level 1, left and right children of root as level 2 and so on.

For example, in the following tree, sum of nodes at odd level is (5 + 1 + 4 + 8) which is 18. And sum of nodes at even level is (2 + 6 + 3 + 7 + 9) which is 27. The output for following tree should be 18 – 27 which is -9.

   5
 /   \
2     6
/  \     \  
1    4     8
 /     /     \ 
3     7       9  

A straightforward method is to use level order traversal. In the traversal, check level of current node, if it is odd, increment odd sum by data of current node, otherwise increment even sum. Finally return difference between odd sum and even sum. See following for implementation of this approach.

For Iterative approach , simply traverse the tree level by level (level order traversal), store sum of node values in even no. level in evenSum and rest in variable oddSum and finally return the difference.

Below is the simple implementation of the approach.

// CPP program to find

// difference between

// sums of odd level

// and even level nodes

// of binary tree

#include <bits/stdc++.h>

using namespace std;

// tree node

struct Node

{

int data;

Node *left, *right;

};

// returns a new

// tree Node

Node* newNode( int data)

{

Node* temp = new Node();

temp->data = data;

temp->left = temp->right = NULL;

return temp;

}

// return difference of

// sums of odd level

// and even level

int evenOddLevelDifference(Node* root)

{

if (!root)

return 0;

// create a queue for

// level order traversal

queue<Node*> q;

q.push(root);

int level = 0;

int evenSum = 0, oddSum = 0;

// traverse until the

// queue is empty

while (!q.empty())

{

int size = q.size();

level += 1;

// traverse for

// complete level

while (size > 0)

{

Node* temp = q.front();

q.pop();

// check if level no.

// is even or odd and

// accordingly update

// the evenSum or oddSum

if (level % 2 == 0)

evenSum += temp->data;

else

oddSum += temp->data;

// check for left child

if (temp->left)

{

q.push(temp->left);

}

// check for right child

if (temp->right)

{

q.push(temp->right);

}

size -= 1;

}

}

return (oddSum - evenSum);

}

// driver program

int main()

{

// construct a tree

Node* root = newNode(5);

root->left = newNode(2);

root->right = newNode(6);

root->left->left = newNode(1);

root->left->right = newNode(4);

root->left->right->left = newNode(3);

root->right->right = newNode(8);

root->right->right->right = newNode(9);

root->right->right->left = newNode(7);

int result = evenOddLevelDifference(root);

cout << "diffence between sums is :: " ;

cout << result << endl;

return 0;

}

Output:

diffence between sums is -9