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
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++ implementation of the approach #include <bits/stdc++.h> 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<Node*> 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 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<Node> 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 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# 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<Node> q = new Queue<Node>();
// 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 |
<script> // JavaScript implementation of the approach
class Node
{
constructor(data) {
this .left = null ;
this .right = null ;
this .data = data;
}
}
// Iterative method to perform level
// order traversal line by line
function nodeSumDiff(root)
{
// Base Case
if (root == null )
return 0;
let evenPositionNodeSum = 0;
let oddPositionNodeSum = 0;
// Create an empty queue for level
// order traversal
let q = [];
// Enqueue root element
q.push(root);
while (1 == 1)
{
// nodeCount (queue size) indicates
// number of nodes in the current level
let nodeCount = q.length;
if (nodeCount == 0)
break ;
// Mark 1st node as even positioned
let oddPosition = true ;
// Dequeue all the nodes of current level
// and Enqueue all the nodes of next level
while (nodeCount > 0)
{
let node = q[0];
// Depending upon node position
// add value to their respective sum
if (oddPosition)
oddPositionNodeSum += node.data;
else
evenPositionNodeSum += node.data;
q.shift();
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 Math.abs(oddPositionNodeSum - evenPositionNodeSum);
}
// Utility method to create a node
function newNode(data)
{
let node = new Node(data);
return (node);
}
let 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);
document.write(nodeSumDiff(root));
</script> |
7
Time Complexity: O(N) where n is the number of nodes in the binary tree.
Auxiliary Space: O(N) where n is the number of nodes in the binary tree.