Given a binary tree, return the tilt of the whole tree. The tilt of a tree node is defined as the absolute difference between the sum of all left subtree node values and the sum of all right subtree node values. Null nodes are assigned tilt to be zero. Therefore, tilt of the whole tree is defined as the sum of all nodes’ tilt.
Examples:
Input :
1
/ \
2 3
Output : 1
Explanation:Tilt of node 2 : 0
Tilt of node 3 : 0
Tilt of node 1 : |2-3| = 1
Tilt of binary tree : 0 + 0 + 1 = 1
Input :
4
/ \
2 9
/ \ \
3 5 7
Output : 15
Explanation:Tilt of node 3 : 0
Tilt of node 5 : 0
Tilt of node 7 : 0
Tilt of node 2 : |3-5| = 2
Tilt of node 9 : |0-7| = 7
Tilt of node 4 : |(3+5+2)-(9+7)| = 6
Tilt of binary tree : 0 + 0 + 0 + 2 + 7 + 6 = 15
Naive Approach (Finding Sum at every Node): The idea is to find the sum of the left and the right subtree at every node and keep adding their absolute differences. Find the sum of the left subtree and right subtree using the findSum function and take its absolute difference and at the end return the sum of absolute diff and leftSubtree tilt and rightSubtree tilt which will be the total tilt of the tree.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int val;
struct Node *left, *right;
};
int findSum(Node* root)
{
if (root == NULL)
return 0;
return root->val + findSum(root->left)
+ findSum(root->right);
}
int Tilt(Node* root)
{
if (root == NULL)
return 0;
int left = Tilt(root->left);
int right = Tilt(root->right);
return abs (findSum(root->left) - findSum(root->right))
+ left + right;
}
Node* newNode( int data)
{
Node* temp = new Node;
temp->val = data;
temp->left = temp->right = NULL;
return temp;
}
int main()
{
Node* root = NULL;
root = newNode(4);
root->left = newNode(2);
root->right = newNode(9);
root->left->left = newNode(3);
root->left->right = newNode(8);
root->right->right = newNode(7);
cout << "The Tilt of whole tree is " << Tilt(root);
return 0;
}
|
Java
class Main {
static class Node {
int val;
Node left, right;
Node( int data) {
val = data;
left = right = null ;
}
}
static int findSum(Node root) {
if (root == null )
return 0 ;
return root.val + findSum(root.left) + findSum(root.right);
}
static int Tilt(Node root) {
if (root == null )
return 0 ;
int left = Tilt(root.left);
int right = Tilt(root.right);
return Math.abs(findSum(root.left) - findSum(root.right)) + left + right;
}
static Node newNode( int data) {
Node temp = new Node(data);
temp.left = temp.right = null ;
return temp;
}
public static void main(String[] args) {
Node root = null ;
root = newNode( 4 );
root.left = newNode( 2 );
root.right = newNode( 9 );
root.left.left = newNode( 3 );
root.left.right = newNode( 8 );
root.right.right = newNode( 7 );
System.out.println( "The Tilt of whole tree is " + Tilt(root));
}
}
|
Python3
class Node:
def __init__( self , data):
self .val = data
self .left = None
self .right = None
def findSum(root):
if root is None :
return 0
return root.val + findSum(root.left) + findSum(root.right)
def Tilt(root):
if root is None :
return 0
left = Tilt(root.left)
right = Tilt(root.right)
return abs (findSum(root.left) - findSum(root.right)) + left + right
def newNode(data):
temp = Node(data)
temp.left = temp.right = None
return temp
if __name__ = = "__main__" :
root = None
root = newNode( 4 )
root.left = newNode( 2 )
root.right = newNode( 9 )
root.left.left = newNode( 3 )
root.left.right = newNode( 8 )
root.right.right = newNode( 7 )
print ( "The Tilt of whole tree is" , Tilt(root))
|
C#
using System;
class GFG
{
class Node
{
public int val;
public Node left, right;
public Node( int data)
{
val = data;
left = null ;
right = null ;
}
}
static int FindSum(Node root)
{
if (root == null )
return 0;
return root.val + FindSum(root.left) + FindSum(root.right);
}
static int Tilt(Node root)
{
if (root == null )
return 0;
int left = Tilt(root.left);
int right = Tilt(root.right);
return Math.Abs(FindSum(root.left) - FindSum(root.right)) + left + right;
}
static Node NewNode( int data)
{
Node temp = new Node(data);
temp.left = temp.right = null ;
return temp;
}
public static void Main( string [] args)
{
Node root = null ;
root = NewNode(4);
root.left = NewNode(2);
root.right = NewNode(9);
root.left.left = NewNode(3);
root.left.right = NewNode(8);
root.right.right = NewNode(7);
Console.WriteLine( "The Tilt of whole tree is " + Tilt(root));
}
}
|
Javascript
class Node {
constructor(data) {
this .val = data;
this .left = null ;
this .right = null ;
}
}
function findSum(root) {
if (root === null ) {
return 0;
}
return root.val + findSum(root.left) + findSum(root.right);
}
function Tilt(root) {
if (root === null ) {
return 0;
}
const left = Tilt(root.left);
const right = Tilt(root.right);
return Math.abs(findSum(root.left) - findSum(root.right)) + left + right;
}
function newNode(data) {
const temp = new Node(data);
temp.left = null ;
temp.right = null ;
return temp;
}
( function () {
let root = null ;
root = newNode(4);
root.left = newNode(2);
root.right = newNode(9);
root.left.left = newNode(3);
root.left.right = newNode(8);
root.right.right = newNode(7);
console.log( "The Tilt of whole tree is " + Tilt(root));
})();
|
Output
The Tilt of whole tree is 15
Complexity Analysis:
Time complexity: O(n2), where n is the number of nodes in binary tree.
Auxiliary Space: O(n) as in worst case, depth of binary tree will be n.
Efficient Approach:
The idea is to recursively traverse tree. While traversing, we keep track of two things, sum of subtree rooted under current node, tilt of current node. Sum is needed to compute tilt of parent.
Implementation:
C++
#include <bits/stdc++.h>
using namespace std;
struct Node {
int val;
struct Node *left, *right;
};
int traverse(Node* root, int * tilt)
{
if (!root)
return 0;
int left = traverse(root->left, tilt);
int right = traverse(root->right, tilt);
*tilt += abs (left - right);
return left + right + root->val;
}
int Tilt(Node* root)
{
int tilt = 0;
traverse(root, &tilt);
return tilt;
}
Node* newNode( int data)
{
Node* temp = new Node;
temp->val = data;
temp->left = temp->right = NULL;
return temp;
}
int main()
{
Node* root = NULL;
root = newNode(4);
root->left = newNode(2);
root->right = newNode(9);
root->left->left = newNode(3);
root->left->right = newNode(8);
root->right->right = newNode(7);
cout << "The Tilt of whole tree is " << Tilt(root);
return 0;
}
|
Java
import java.util.*;
class GfG {
static class Node {
int val;
Node left, right;
}
static class T{
int tilt = 0 ;
}
static int traverse(Node root, T t)
{
if (root == null )
return 0 ;
int left = traverse(root.left, t);
int right = traverse(root.right, t);
t.tilt += Math.abs(left - right);
return left + right + root.val;
}
static int Tilt(Node root)
{
T t = new T();
traverse(root, t);
return t.tilt;
}
static Node newNode( int data)
{
Node temp = new Node();
temp.val = data;
temp.left = null ;
temp.right = null ;
return temp;
}
public static void main(String[] args)
{
Node root = null ;
root = newNode( 4 );
root.left = newNode( 2 );
root.right = newNode( 9 );
root.left.left = newNode( 3 );
root.left.right = newNode( 8 );
root.right.right = newNode( 7 );
System.out.println( "The Tilt of whole tree is " + Tilt(root));
}
}
|
Python3
class newNode:
def __init__( self , data):
self .val = data
self .left = self .right = None
def traverse(root, tilt):
if ( not root):
return 0
left = traverse(root.left, tilt)
right = traverse(root.right, tilt)
tilt[ 0 ] + = abs (left - right)
return left + right + root.val
def Tilt(root):
tilt = [ 0 ]
traverse(root, tilt)
return tilt[ 0 ]
if __name__ = = '__main__' :
root = None
root = newNode( 4 )
root.left = newNode( 2 )
root.right = newNode( 9 )
root.left.left = newNode( 3 )
root.left.right = newNode( 8 )
root.right.right = newNode( 7 )
print ( "The Tilt of whole tree is" ,
Tilt(root))
|
C#
using System;
class GfG
{
public class Node
{
public int val;
public Node left, right;
}
public class T
{
public int tilt = 0;
}
static int traverse(Node root, T t )
{
if (root == null )
return 0;
int left = traverse(root.left, t);
int right = traverse(root.right, t);
t.tilt += Math.Abs(left - right);
return left + right + root.val;
}
static int Tilt(Node root)
{
T t = new T();
traverse(root, t);
return t.tilt;
}
static Node newNode( int data)
{
Node temp = new Node();
temp.val = data;
temp.left = null ;
temp.right = null ;
return temp;
}
public static void Main(String[] args)
{
Node root = null ;
root = newNode(4);
root.left = newNode(2);
root.right = newNode(9);
root.left.left = newNode(3);
root.left.right = newNode(8);
root.right.right = newNode(7);
Console.WriteLine( "The Tilt of whole tree is " + Tilt(root));
}
}
|
Javascript
<script>
class Node
{
constructor(data) {
this .left = null ;
this .right = null ;
this .val = data;
}
}
let tilt = 0;
function traverse(root)
{
if (root == null )
return 0;
let left = traverse(root.left, tilt);
let right = traverse(root.right, tilt);
tilt += Math.abs(left - right);
return left + right + root.val;
}
function Tilt(root)
{
traverse(root);
return tilt;
}
function newNode(data)
{
let temp = new Node(data);
return temp;
}
let root = null ;
root = newNode(4);
root.left = newNode(2);
root.right = newNode(9);
root.left.left = newNode(3);
root.left.right = newNode(8);
root.right.right = newNode(7);
document.write( "The Tilt of whole tree is " + Tilt(root));
</script>
|
Output
The Tilt of whole tree is 15
Complexity Analysis:
- Time complexity: O(n), where n is the number of nodes in binary tree.
- Auxiliary Space: O(n) as in worst case, depth of binary tree will be n.
Feeling lost in the world of random DSA topics, wasting time without progress? It's time for a change! Join our DSA course, where we'll guide you on an exciting journey to master DSA efficiently and on schedule.
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 geeks!
Last Updated :
15 Nov, 2023
Like Article
Save Article