Open In App

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

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>

Output: 
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.


Article Tags :