The idea is to perform a recursive traversal of the binary tree while keeping track of the current level of each node. At each node, we check if the level is odd or even and add the node's data to the respective sum. The recursion continues for both the left and right children, with the level being incremented by 1 for each level deeper in the tree. Finally, the difference between the odd level sum and the even level sum is returned.
C++
// C++ program to find the difference between // sums of odd and even level in a Binary tree // using Recursion#include<bits/stdc++.h>usingnamespacestd;classNode{public:intdata;Node*left,*right;Node(intx){data=x;left=nullptr;right=nullptr;}};voidgetLevelDiffHelper(Node*root,intlevel,int&oddSum,int&evenSum){// Base case: If the node is nullptr, returnif(root==nullptr){return;}// Add to oddSum or evenSum based on the levelif(level%2!=0){oddSum+=root->data;}else{evenSum+=root->data;}// Recur for left and right children with // incremented levelgetLevelDiffHelper(root->left,level+1,oddSum,evenSum);getLevelDiffHelper(root->right,level+1,oddSum,evenSum);}intgetLevelDiff(Node*root){// Initialize sums for odd and even levelsintoddSum=0,evenSum=0;// Start the recursion from level 1getLevelDiffHelper(root,1,oddSum,evenSum);// Return the difference between odd// and even sumsreturnoddSum-evenSum;}intmain(){// Hardcoded input binary tree// 10// / \ // 20 30// / \ // 40 60 Node*root=newNode(10);root->left=newNode(20);root->right=newNode(30);root->left->left=newNode(40);root->left->right=newNode(60);cout<<getLevelDiff(root)<<endl;return0;}
C
// C program to find the difference between // sums of odd and even level in a Binary tree // using Recursion#include<stdio.h>#include<stdlib.h>structNode{intdata;structNode*left;structNode*right;};// Helper function for getLevelDiffvoidgetLevelDiffHelper(structNode*root,intlevel,int*oddSum,int*evenSum){// Base case: If the node is NULL, returnif(root==NULL){return;}// Add to oddSum or evenSum based on the levelif(level%2!=0){*oddSum+=root->data;}else{*evenSum+=root->data;}// Recur for left and right children with // incremented levelgetLevelDiffHelper(root->left,level+1,oddSum,evenSum);getLevelDiffHelper(root->right,level+1,oddSum,evenSum);}// Function to calculate the difference between// sums of odd and even levelsintgetLevelDiff(structNode*root){// Initialize sums for odd and even levelsintoddSum=0,evenSum=0;// Start the recursion from level 1getLevelDiffHelper(root,1,&oddSum,&evenSum);// Return the difference between odd// and even sumsreturnoddSum-evenSum;}structNode*createNode(intx){structNode*newNode=(structNode*)malloc(sizeof(structNode));newNode->data=x;newNode->left=NULL;newNode->right=NULL;returnnewNode;}intmain(){// Hardcoded input binary tree// 10// / \ // 20 30// / \ // 40 60 structNode*root=createNode(10);root->left=createNode(20);root->right=createNode(30);root->left->left=createNode(40);root->left->right=createNode(60);printf("%d\n",getLevelDiff(root));return0;}
Java
// Java program to find the difference between // sums of odd and even level in a Binary tree // using Recursionimportjava.util.*;classNode{intdata;Nodeleft,right;Node(intx){data=x;left=null;right=null;}}classGfG{staticvoidgetLevelDiffHelper(Noderoot,intlevel,int[]oddSum,int[]evenSum){// Base case: If the node is null, returnif(root==null){return;}// Add to oddSum or evenSum based on the levelif(level%2!=0){oddSum[0]+=root.data;}else{evenSum[0]+=root.data;}// Recur for left and right children with // incremented levelgetLevelDiffHelper(root.left,level+1,oddSum,evenSum);getLevelDiffHelper(root.right,level+1,oddSum,evenSum);}staticintgetLevelDiff(Noderoot){// Initialize sums for odd and even levelsint[]oddSum={0},evenSum={0};// Start the recursion from level 1getLevelDiffHelper(root,1,oddSum,evenSum);// Return the difference between odd// and even sumsreturnoddSum[0]-evenSum[0];}publicstaticvoidmain(String[]args){// Hardcoded input binary tree// 10// / \// 20 30// / \ // 40 60 Noderoot=newNode(10);root.left=newNode(20);root.right=newNode(30);root.left.left=newNode(40);root.left.right=newNode(60);System.out.println(getLevelDiff(root));}}
Python
# Python program to find the difference between # sums of odd and even level in a Binary tree # using RecursionclassNode:def__init__(self,x):self.data=xself.left=Noneself.right=NonedefgetLevelDiffHelper(root,level,oddSum,evenSum):# Base case: If the node is None, returnifrootisNone:return# Add to oddSum or evenSum based on the leveliflevel%2!=0:oddSum[0]+=root.dataelse:evenSum[0]+=root.data# Recur for left and right children with # incremented levelgetLevelDiffHelper(root.left,level+1,oddSum,evenSum)getLevelDiffHelper(root.right,level+1,oddSum,evenSum)defgetLevelDiff(root):# Initialize sums for odd and even levelsoddSum=[0]evenSum=[0]# Start the recursion from level 1getLevelDiffHelper(root,1,oddSum,evenSum)# Return the difference between odd# and even sumsreturnoddSum[0]-evenSum[0]if__name__=="__main__":# Hardcoded input binary tree# 10# / \# 20 30# / \ # 40 60 root=Node(10)root.left=Node(20)root.right=Node(30)root.left.left=Node(40)root.left.right=Node(60)print(getLevelDiff(root))
C#
// C# program to find the difference between // sums of odd and even level in a Binary tree // using RecursionusingSystem;classNode{publicintdata;publicNodeleft,right;publicNode(intx){data=x;left=null;right=null;}}classGfG{staticvoidgetLevelDiffHelper(Noderoot,intlevel,refintoddSum,refintevenSum){// Base case: If the node is null, returnif(root==null){return;}// Add to oddSum or evenSum based on the levelif(level%2!=0){oddSum+=root.data;}else{evenSum+=root.data;}// Recur for left and right children with // incremented levelgetLevelDiffHelper(root.left,level+1,refoddSum,refevenSum);getLevelDiffHelper(root.right,level+1,refoddSum,refevenSum);}staticintgetLevelDiff(Noderoot){// Initialize sums for odd and even levelsintoddSum=0,evenSum=0;// Start the recursion from level 1getLevelDiffHelper(root,1,refoddSum,refevenSum);// Return the difference between odd// and even sumsreturnoddSum-evenSum;}staticvoidMain(string[]args){// Hardcoded input binary tree// 10// / \// 20 30// / \ // 40 60 Noderoot=newNode(10);root.left=newNode(20);root.right=newNode(30);root.left.left=newNode(40);root.left.right=newNode(60);Console.WriteLine(getLevelDiff(root));}}
JavaScript
// JavaScript program to find the difference between // sums of odd and even level in a Binary tree // using RecursionclassNode{constructor(x){this.data=x;this.left=null;this.right=null;}}functiongetLevelDiffHelper(root,level,oddSum,evenSum){// Base case: If the node is null, returnif(root===null){return;}// Add to oddSum or evenSum based on the levelif(level%2!==0){oddSum.value+=root.data;}else{evenSum.value+=root.data;}// Recur for left and right children with // incremented levelgetLevelDiffHelper(root.left,level+1,oddSum,evenSum);getLevelDiffHelper(root.right,level+1,oddSum,evenSum);}functiongetLevelDiff(root){// Initialize sums for odd and even levelsconstoddSum={value:0};constevenSum={value:0};// Start the recursion from level 1getLevelDiffHelper(root,1,oddSum,evenSum);// Return the difference between odd// and even sumsreturnoddSum.value-evenSum.value;}// Hardcoded input binary tree// 10// / \// 20 30// / \ // 40 60 constroot=newNode(10);root.left=newNode(20);root.right=newNode(30);root.left.left=newNode(40);root.left.right=newNode(60);console.log(getLevelDiff(root));
Output
60
Using Level Order Traversal - O(n) Time and O(n) Space
The idea is to use line by line level-order traversal (BFS) to process nodes level by level. We maintain a queue to traverse nodes level by level and use a boolean flag to alternate between odd and even levels. As we visit each node, we add its value to the appropriate sum (either oddSum or evenSum). After processing all nodes, the difference between the odd and even level sums is returned.
C++
// C++ program to find difference between// sums of odd and even level in a tree#include<bits/stdc++.h>usingnamespacestd;classNode{public:intdata;Node*left,*right;Node(intx){data=x;left=nullptr;right=nullptr;}};intgetLevelDiff(Node*root){// If the tree is emptyif(root==nullptr){return0;}// Queue for level-order traversalqueue<Node*>q;q.push(root);intoddSum=0,evenSum=0;boolisOdd=true;while(!q.empty()){intsize=q.size();for(inti=0;i<size;i++){Node*curr=q.front();q.pop();// Add to oddSum or evenSumif(isOdd){oddSum+=curr->data;}else{evenSum+=curr->data;}// Push left and right children// to the queueif(curr->left){q.push(curr->left);}if(curr->right){q.push(curr->right);}}// Toggle odd/even levelisOdd=!isOdd;}returnoddSum-evenSum;}intmain(){// Hardcoded input binary tree// 10// / \ // 20 30// / \ // 40 60Node*root=newNode(10);root->left=newNode(20);root->right=newNode(30);root->left->left=newNode(40);root->left->right=newNode(60);cout<<getLevelDiff(root)<<endl;return0;}
Java
// Java program to find difference between// sums of odd and even level in a treeimportjava.io.*;importjava.util.*;classNode{intdata;Nodeleft,right;Node(intkey){data=key;left=right=null;}}classGfG{staticintgetLevelDiff(Noderoot){if(root==null)return0;// create a queue for// level order traversalQueue<Node>q=newLinkedList<>();q.add(root);intlevel=0;intevenSum=0,oddSum=0;// traverse until the// queue is emptywhile(q.size()!=0){intsize=q.size();level++;// traverse for complete levelwhile(size>0){Nodetemp=q.remove();// check if level no is even or odd and // accordingly update the evenSum or oddSumif(level%2==0)evenSum+=temp.data;elseoddSum+=temp.data;// check for left childif(temp.left!=null)q.add(temp.left);// check for right childif(temp.right!=null)q.add(temp.right);size--;}}return(oddSum-evenSum);}publicstaticvoidmain(Stringargs[]){// Create a hard coded tree// 10// / \// 20 30// / \// 40 60Noderoot=newNode(10);root.left=newNode(20);root.right=newNode(30);root.left.left=newNode(40);root.left.right=newNode(60);System.out.println(getLevelDiff(root));}}
Python
# Python program to find difference between # sums of odd and even level in a treefromcollectionsimportdequeclassNode:def__init__(self,x):self.data=xself.left=Noneself.right=NonedefgetLevelDiff(root):# If the tree is emptyifrootisNone:return0# Queue for level-order traversalq=deque()q.append(root)oddSum=0evenSum=0isOdd=Truewhileq:size=len(q)foriinrange(size):curr=q.popleft()# Add to oddSum or evenSumifisOdd:oddSum+=curr.dataelse:evenSum+=curr.data# Push left and right children # to the queueifcurr.left:q.append(curr.left)ifcurr.right:q.append(curr.right)# Toggle odd/even levelisOdd=notisOddreturnoddSum-evenSumif__name__=="__main__":# Hardcoded input binary tree# 10# / \# 20 30# / \ # 40 60 root=Node(10)root.left=Node(20)root.right=Node(30)root.left.left=Node(40)root.left.right=Node(60)print(getLevelDiff(root))
C#
// C# program to find difference between// sums of odd and even level in a treeusingSystem;usingSystem.Collections.Generic;classNode{publicintdata;publicNodeleft,right;publicNode(intkey){data=key;left=right=null;}}classGfG{staticintgetLevelDiff(Noderoot){if(root==null)return0;// create a queue for// level order traversalQueue<Node>q=newQueue<Node>();q.Enqueue(root);intlevel=0;intevenSum=0,oddSum=0;// traverse until the// queue is emptywhile(q.Count!=0){intsize=q.Count;level++;// traverse for complete levelwhile(size>0){Nodetemp=q.Dequeue();// check if level no is even or odd and // accordingly update the evenSum or oddSumif(level%2==0)evenSum+=temp.data;elseoddSum+=temp.data;// check for left childif(temp.left!=null)q.Enqueue(temp.left);// check for right childif(temp.right!=null)q.Enqueue(temp.right);size--;}}return(oddSum-evenSum);}staticvoidMain(String[]args){// Create a hard coded tree// 10// / \// 20 30// / \// 40 60Noderoot=newNode(10);root.left=newNode(20);root.right=newNode(30);root.left.left=newNode(40);root.left.right=newNode(60);Console.WriteLine(getLevelDiff(root));}}
JavaScript
// JavaScript program to find the difference between// sums of odd and even levels in a treeclassNode{constructor(x){this.data=x;this.left=null;this.right=null;}}functiongetLevelDiff(root){// If the tree is emptyif(root===null){return0;}// Queue for level-order traversalletq=[];q.push(root);letoddSum=0,evenSum=0;letisOdd=true;while(q.length>0){letsize=q.length;// Process all nodes at the current levelfor(leti=0;i<size;i++){letcurr=q.shift();// Add to oddSum or evenSumif(isOdd){oddSum+=curr.data;}else{evenSum+=curr.data;}// Push left and right children to the queueif(curr.left!==null){q.push(curr.left);}if(curr.right!==null){q.push(curr.right);}}// Toggle odd/even levelisOdd=!isOdd;}returnoddSum-evenSum;}// Hardcoded input binary tree// 10// / \// 20 30// / \ // 40 60letroot=newNode(10);root.left=newNode(20);root.right=newNode(30);root.left.left=newNode(40);root.left.right=newNode(60);console.log(getLevelDiff(root));