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;
}
|
OutputThe 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>
|
OutputThe 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.