Minimum difference between any two weighted nodes in Sum Tree of the given Tree
Last Updated :
28 Jan, 2022
Given a tree of N nodes, the task is to convert the given tree to its Sum Tree(including its own weight) and find the minimum difference between any two node's weight of the sum tree.
Note: The N nodes of the given tree are given in the form of top to bottom with N-1 line where each line describes two nodes that are connected.
Examples:
Input:
Output: 1
Explanation:
total weight of node 1: 3 (own weight) + (10 + 6 + 5 + 8 + 2 + 7 + 11) (sub-tree node's weight) = 52
total weight of node 2: 5 (own weight) + (2 + 7 + 11) (sub-tree node's weight) = 25
total weight of node 3: 8 (own weight) + (0) (sub-tree node's weight) = 8
total weight of node 4: 10 (own weight) + (0) (sub-tree node's weight) = 10
total weight of node 5: 2 (own weight) + (0) (sub-tree node's weight) = 2
total weight of node 6: 6 (own weight) + (5 + 8 + 2 + 7 + 11) (sub-tree node's weight) = 39
total weight of node 7: 7 (own weight) + (0) (sub-tree node's weight) = 7
total weight of node 8: 11 (own weight) + (0) (sub-tree node's weight) = 11
By observing the total weight of each node, Node 4 and 8 have a minimum difference(11-10) = 1
Input:
Output: 0
Approach:
- We will traverse the given tree from below and store the weight of that node plus its sub-tree node's weight in one array and mark the index of each node as visited. So in between, if we revisit that node then we don't have to count the weight of that node again.
- We will sort the array where we have stored the total weight of each node.
- Now find the pairwise difference in the sorted array and whichever pair gave minimum difference print that minimum difference at last.
Below is the implementation of the above approach:
C++
// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
// Function to find minimum
// difference between any two node
void MinimumDifference(int total_weight[],
int N)
{
int min_difference = INT_MAX;
for (int i = 1; i < N; i++) {
// Pairwise difference
if (total_weight[i]
- total_weight[i - 1]
< min_difference) {
min_difference
= total_weight[i]
- total_weight[i - 1];
}
}
cout << min_difference << endl;
}
// Function to find total weight
// of each individual node
void SumTree(vector<pair<int, int> > v,
int individual_weight[],
int N)
{
// Array to store total weight
// of each node from 1 to N
int total_weight[N] = { 0 };
// Array to keep track of node
// previously counted or not
int visited[N] = { 0 };
// To store node no. from
/// N-1 lines
int first, second;
// To traverse from (N-1)
// line to 1 line
for (int i = (N - 2); i >= 0; i--) {
first = v[i].first;
second = v[i].second;
// Node is note visited
if (visited[second - 1] == 0) {
total_weight[second - 1]
+= individual_weight[second - 1];
// Make node visited
visited[second - 1] = 1;
}
total_weight[first - 1]
+= total_weight[second - 1];
// Node is note visited
if (visited[first - 1] == 0) {
total_weight[first - 1]
+= individual_weight[first - 1];
// Make node visited
visited[first - 1] = 1;
}
}
// Sort the total weight of each node
sort(total_weight, total_weight + N);
// Call function to find minimum
// difference
MinimumDifference(total_weight, N);
}
// Driver code
int main()
{
// Total node of rooted tree
int N = 8;
vector<pair<int, int> > v;
// N-1 lines describing
// rooted tree from top
// to bottom
v.push_back(make_pair(1, 4));
v.push_back(make_pair(1, 6));
v.push_back(make_pair(6, 2));
v.push_back(make_pair(6, 3));
v.push_back(make_pair(2, 5));
v.push_back(make_pair(2, 7));
v.push_back(make_pair(2, 8));
// Array describing weight
// of each node from 1 to N
int individual_weight[N] = { 3, 5, 8, 10,
2, 6, 7, 11 };
SumTree(v, individual_weight, N);
return 0;
}
Java
// Java program for the above approach
import java.util.*;
class GFG{
static class pair
{
int first, second;
public pair(int first, int second)
{
this.first = first;
this.second = second;
}
}
// Function to find minimum
// difference between any two node
static void MinimumDifference(int total_weight[],
int N)
{
int min_difference = Integer.MAX_VALUE;
for(int i = 1; i < N; i++)
{
// Pairwise difference
if (total_weight[i] -
total_weight[i - 1] <
min_difference)
{
min_difference = total_weight[i] -
total_weight[i - 1];
}
}
System.out.print(min_difference + "\n");
}
// Function to find total weight
// of each individual node
static void SumTree(Vector<pair> v,
int individual_weight[],
int N)
{
// Array to store total weight
// of each node from 1 to N
int total_weight[] = new int[N];
// Array to keep track of node
// previously counted or not
int visited[] = new int[N];
// To store node no. from
/// N-1 lines
int first, second;
// To traverse from (N-1)
// line to 1 line
for(int i = (N - 2); i >= 0; i--)
{
first = v.get(i).first;
second = v.get(i).second;
// Node is note visited
if (visited[second - 1] == 0)
{
total_weight[second - 1] +=
individual_weight[second - 1];
// Make node visited
visited[second - 1] = 1;
}
total_weight[first - 1] +=
total_weight[second - 1];
// Node is note visited
if (visited[first - 1] == 0)
{
total_weight[first - 1] +=
individual_weight[first - 1];
// Make node visited
visited[first - 1] = 1;
}
}
// Sort the total weight of each node
Arrays.sort(total_weight);
// Call function to find minimum
// difference
MinimumDifference(total_weight, N);
}
// Driver code
public static void main(String[] args)
{
// Total node of rooted tree
int N = 8;
Vector<pair> v = new Vector<>();
// N-1 lines describing
// rooted tree from top
// to bottom
v.add(new pair(1, 4));
v.add(new pair(1, 6));
v.add(new pair(6, 2));
v.add(new pair(6, 3));
v.add(new pair(2, 5));
v.add(new pair(2, 7));
v.add(new pair(2, 8));
// Array describing weight
// of each node from 1 to N
int individual_weight[] = { 3, 5, 8, 10,
2, 6, 7, 11 };
SumTree(v, individual_weight, N);
}
}
// This code is contributed by Amit Katiyar
Python3
# Python3 program for the above approach
import sys
# Function to find minimum difference
# between any two node
def minimum_difference(total_weight, n):
min_difference = sys.maxsize
for i in range(1, n):
# Pairwise difference
if (total_weight[i] -
total_weight[i - 1] <
min_difference):
min_difference = (total_weight[i] -
total_weight[i - 1])
print(min_difference)
# Function to find total weight
# of each individual node
def SumTree(v, individual_weight, N):
# Array to store total weight of
# each node from 1 to n
total_weight = [0 for i in range(N)]
# Array to keep track of node
# previously counted or not
visited = [0 for i in range(N)]
# To traverse from (n-1) line to 1 line
for i in range(N - 2, -1, -1):
first = v[i][0]
second = v[i][1]
if visited[second - 1] == 0:
total_weight[second - 1] += (
individual_weight[second - 1])
# Make node visited
visited[second - 1] = 1
total_weight[first - 1] += (
total_weight[second - 1])
# Node is note visited
if visited[first - 1] == 0:
total_weight[first - 1] += (
individual_weight[first - 1])
# Make node visited
visited[first - 1] = 1
# Sort the total weight of each node
total_weight.sort()
# Call function to find minimum difference
minimum_difference(total_weight, n)
# Driver Code
if __name__=='__main__':
# Total node of rooted tree
n = 8
v = []
# n-1 lines describing rooted
# tree from top to bottom
v.append([1, 4])
v.append([1, 6])
v.append([6, 2])
v.append([6, 3])
v.append([2, 5])
v.append([2, 7])
v.append([2, 8])
# Array describing weight of each
# node from 1 to n
individual_weight = [ 3, 5, 8, 10,
2, 6, 7, 11 ]
SumTree(v, individual_weight, n)
# This code is contributed by rutvik_56
C#
// C# program for the
// above approach
using System;
using System.Collections.Generic;
class GFG{
class pair
{
public int first,
second;
public pair(int first,
int second)
{
this.first = first;
this.second = second;
}
}
// Function to find minimum
// difference between any two node
static void MinimumDifference(int []total_weight,
int N)
{
int min_difference = int.MaxValue;
for(int i = 1; i < N; i++)
{
// Pairwise difference
if (total_weight[i] -
total_weight[i - 1] <
min_difference)
{
min_difference = total_weight[i] -
total_weight[i - 1];
}
}
Console.Write(min_difference + "\n");
}
// Function to find total weight
// of each individual node
static void SumTree(List<pair> v,
int []individual_weight,
int N)
{
// Array to store total weight
// of each node from 1 to N
int []total_weight = new int[N];
// Array to keep track of node
// previously counted or not
int []visited = new int[N];
// To store node no. from
/// N-1 lines
int first, second;
// To traverse from (N-1)
// line to 1 line
for(int i = (N - 2); i >= 0; i--)
{
first = v[i].first;
second = v[i].second;
// Node is note visited
if (visited[second - 1] == 0)
{
total_weight[second - 1] +=
individual_weight[second - 1];
// Make node visited
visited[second - 1] = 1;
}
total_weight[first - 1] +=
total_weight[second - 1];
// Node is note visited
if (visited[first - 1] == 0)
{
total_weight[first - 1] +=
individual_weight[first - 1];
// Make node visited
visited[first - 1] = 1;
}
}
// Sort the total weight
// of each node
Array.Sort(total_weight);
// Call function to find minimum
// difference
MinimumDifference(total_weight, N);
}
// Driver code
public static void Main(String[] args)
{
// Total node of rooted tree
int N = 8;
List<pair> v = new List<pair>();
// N-1 lines describing
// rooted tree from top
// to bottom
v.Add(new pair(1, 4));
v.Add(new pair(1, 6));
v.Add(new pair(6, 2));
v.Add(new pair(6, 3));
v.Add(new pair(2, 5));
v.Add(new pair(2, 7));
v.Add(new pair(2, 8));
// Array describing weight
// of each node from 1 to N
int []individual_weight = {3, 5, 8, 10,
2, 6, 7, 11};
SumTree(v, individual_weight, N);
}
}
// This code is contributed by shikhasingrajput
JavaScript
<script>
// Javascript program for the above approach
// Function to find minimum
// difference between any two node
function MinimumDifference(total_weight, N)
{
let min_difference = Number.MAX_VALUE;
for (let i = 1; i < N; i++) {
// Pairwise difference
if (total_weight[i]
- total_weight[i - 1]
< min_difference) {
min_difference
= total_weight[i]
- total_weight[i - 1];
}
}
document.write(min_difference + "</br>");
}
// Function to find total weight
// of each individual node
function SumTree(v, individual_weight, N)
{
// Array to store total weight
// of each node from 1 to N
let total_weight = new Array(N);
total_weight.fill(0);
// Array to keep track of node
// previously counted or not
let visited = new Array(N);
visited.fill(0);
// To store node no. from
/// N-1 lines
let first, second;
// To traverse from (N-1)
// line to 1 line
for (let i = (N - 2); i >= 0; i--) {
first = v[i][0];
second = v[i][1];
// Node is note visited
if (visited[second - 1] == 0) {
total_weight[second - 1]
+= individual_weight[second - 1];
// Make node visited
visited[second - 1] = 1;
}
total_weight[first - 1]
+= total_weight[second - 1];
// Node is note visited
if (visited[first - 1] == 0) {
total_weight[first - 1]
+= individual_weight[first - 1];
// Make node visited
visited[first - 1] = 1;
}
}
// Sort the total weight of each node
total_weight.sort(function(a, b){return a - b});
// Call function to find minimum
// difference
MinimumDifference(total_weight, N);
}
// Total node of rooted tree
let N = 8;
let v = [];
// N-1 lines describing
// rooted tree from top
// to bottom
v.push([1, 4]);
v.push([1, 6]);
v.push([6, 2]);
v.push([6, 3]);
v.push([2, 5]);
v.push([2, 7]);
v.push([2, 8]);
// Array describing weight
// of each node from 1 to N
let individual_weight = [ 3, 5, 8, 10, 2, 6, 7, 11 ];
SumTree(v, individual_weight, N);
// This code is contributed by decode2207.
</script>
Time Complexity: O(N * Log(N)), where N is the total of nodes in the rooted tree.
Auxiliary Space: O(N)
Similar Reads
Minimum Cost of Simple Path between two nodes in a Directed and Weighted Graph Given a directed graph, which may contain cycles, where every edge has weight, the task is to find the minimum cost of any simple path from a given source vertex âsâ to a given destination vertex âtâ. Simple Path is the path from one vertex to another such that no vertex is visited more than once. I
10 min read
Minimum distance to visit all the nodes of an undirected weighted tree Given a weighted tree with N nodes starting from 1 to N. The distance between any two nodes is given by the edge weight. Node 1 is the source, the task is to visit all the nodes of the tree with the minimum distance traveled. Examples: Input: u[] = {1, 1, 2, 2, 1} v[] = {2, 3, 5, 6, 4} w[] = {1, 4,
10 min read
Count the nodes in the given tree whose sum of digits of weight is odd Given a tree, and the weights of all the nodes, the task is to count the number of nodes whose sum of digits of weights is odd.Examples: Input: Output: 3 Node 1: digitSum(144) = 1 + 4 + 4 = 9 Node 2: digitSum(1234) = 1 + 2 + 3 + 4 = 10 Node 3: digitSum(21) = 2 + 1 = 3 Node 4: digitSum(5) = 5 Node 5:
6 min read
Find the maximum Even Digit Sum node in the given tree Given a tree with the weights of all the nodes, the task is to find the maximum weighing node whose weight has even digit sum. Examples: Input: Tree = 5 / \ 10 6 / \ 11 8 Output: 11 Explanation: The tree node weights are: 5 -> 5 10 -> 1 + 0 = 1 6 -> 6 11 -> 1 + 1 = 2 8 -> 8 Here, digi
7 min read
Find the Absolute Difference between the Right View Sum of two Binary Trees Given two binary trees, the task is to find the sum of the absolute differences between the right view of binary trees. Examples: Input: Tree 1: 10 / \ 5 20 / \ \ 4 7 30 Tree 2: 50 / \ 25 60 / \ / \ 20 30 55 70 Output: 120Explanation: For Tree 1, the right view nodes are 10, 20, and 30. Therefore, t
11 min read
Check whether the given node is in the path between the nodes U and V Given three vertices U, V and R of a binary tree, the task is to check whether R lies in the path between U and V. If it is not present in the path then print No otherwise print Yes.Examples: Input: U = 4, V = 6, R = 2 Output: Yes Path 4 -> 2 -> 1 -> 3 -> 6 contains 2Input: U = 4, V = 6,
13 min read
Maximum absolute difference between the sibling nodes of given BST Given a BST (Binary Search Tree) with N Nodes, the task is to find the maximum absolute difference between the sibling nodes. Two nodes are said to be siblings if they are present at the same level, and their parents are the same.] Examples: Input: Diagram 1 for Ex-1 Output: 70Explanation:105 - 50 =
8 min read
Difference of Max and Min Subtree Sums in Tree Nodes Given a tree containing N nodes in the form of an array P where Pi represents the parent of the i-th node and P1 = -1 as the tree is rooted at node 1. Also given an array vals which consists of the value of the ith node from 1 to N. For each node in the tree find the difference between the maximum a
8 min read
Maximum absolute difference between any two level sum in a N-ary Tree Given an N-ary Tree having N nodes with positive and negative values and (N - 1) edges, the task is to find the maximum absolute difference of level sum in it. Examples: Input: N = 8, Edges[][2] = {{0, 1}, {0, 2}, {0, 3}, {1, 4}, {1, 5}, {3, 6}, {6, 7}}, Value[] = {4,2, 3, -5,-1, 3, -2, 6}, Below is
9 min read
Maximize the sum of products of the degrees between any two vertices of the tree Given an integer N, the task is to construct a tree such that the sum of degree(u) * degree(v) for all ordered pairs (u, v) is the maximum where u != v. Print the maximum possible sum. Examples: Input: N = 4 Output: 26 1 / 2 / 3 / 4 For node 1, 1*2 + 1*2 + 1*1 = 5 For node 2, 2*1 + 2*2 + 2*1 = 8 For
6 min read