Thursday, October 9, 2025
HomeData Modelling & AISum of Nodes and respective Neighbors on the path from root to...

Sum of Nodes and respective Neighbors on the path from root to a vertex V

Given a rooted tree having N vertices, an array values[ ], which represents the value assigned to each node, and a vertex V, the task is to calculate the sum of values of nodes and immediate neighbors lying in the path from the root(always 0) to V.

Examples:  

Input: N = 8, values = {1, 2, 3, 0, 0, 4, 3, 6}, V = 7 
 

Output: 16 
Explanation: 
Path from root (0) to V (7) = 0 -> 1 -> 4 -> 7 
Neighbors of 0 = (2, 3), Sum = 1(node 0) + 3(node 2) + 0(node 3) = 4 
Neighbors of 1 = (5), Sum = 2(node 1) + 4(node 5) = 6 
No neighbor of 4, Sum = 0(node 4) = 0 
No neighbor of 7, Sum = 6(node 7) = 6 
Total sum = 4 + 6 + 0 + 6 = 16

Input: N = 5, values = {5, 6, 2, 9, 0}, V = 2 
 

Output: 13

Approach:

The idea is to store the parent of each node in an array and add the value of each parent with its child and store it in the parent node. Now, each node will hold sum of its value and value of corresponding neighbors. Use this array to find the required sum of the path from root to vertex V.

Follow the steps below to solve the problem: 

  • Initialize an array to store the values of each node and its corresponding neighbors using DFS Traversal.
  • Iterate from vertex V to root using the array and keep adding the value of all the nodes found on the path.
  • Finally, print the obtained sum.

Below is the implementation of the above approach:

C++




// C++ Program to implement
// the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Creating Adjacency list
vector<vector<int>> constructTree(int n,
                                  vector<vector<int>> edges)
{
  vector<vector<int>> adjl(n);
 
  for (auto e : edges)
  {
    int u = e[0];
    int v = e[1];
    adjl[u].push_back(v);
    adjl[v].push_back(u);
  }
  return adjl;
}
 
// Function to perform DFS traversal
void DFS(vector<vector<int>> adjl,
         vector<int> &parent, int u, int p)
{
   
  // Initializing parent of each node to p
  parent[u] = p;
 
  // Iterate over the children
  for (int v : adjl[u])
  {
    if (v != p)
    {
      DFS(adjl, parent, v, u);
    }
  }
}
 
// Function to add values of children to
// respective parent nodes
vector<int> valuesFromChildren(vector<int> parent,
                               vector<int> values)
{
  vector<int> valuesChildren(parent.size());
 
  for (int i = 0; i < parent.size(); i++)
  {
     
    // Root node
    if (parent[i] == -1)
      continue;
 
    else
    {
      int p = parent[i];
      valuesChildren[p] += values[i];
    }
  }
  return valuesChildren;
}
 
// Function to return sum of values of
// each node in path from V to the root
int findSumOfValues(int v, vector<int> parent,
                    vector<int> valuesChildren)
{
  int cur_node = v;
  int sum = 0;
 
  // Path from node V to root node
  while (cur_node != -1)
  {
    sum += valuesChildren[cur_node];
    cur_node = parent[cur_node];
  }
 
  return sum;
}
 
// Driver Code
int main()
{
  int n = 8;
 
  // Insert edges into the graph
  vector<vector<int>> edges = {{0, 1}, {0, 2}, {0, 3}, {1, 4},
                               {1, 5}, {4, 7}, {3, 6}};
 
  int v = 7;
 
  // Values assigned to each vertex
  vector<int> values = {1, 2, 3, 0, 0, 4, 3, 6};
 
  // Constructing the tree
  // using adjacency list
  vector<vector<int>> adjl = constructTree(n, edges);
 
  // Parent array
  vector<int> parent(n);
 
  // store values in the parent array
  DFS(adjl, parent, 0, -1);
 
  // Add values of children to the parent
  vector<int> valuesChildren = valuesFromChildren(parent, values);
 
  // Find sum of nodes lying in the path
  int sum = findSumOfValues(v, parent, valuesChildren);
 
  // Add root node since
  // its value is not included yet
  sum += values[0];
  cout << sum << endl;
}
 
// This code is contributed by
// sanjeev2552


Java




// Java Program to implement
// the above approach
import java.io.*;
import java.util.*;
 
class GFG {
 
    // Creating Adjacency list
    private static List<List<Integer> >
    constructTree(int n, int[][] edges)
    {
 
        List<List<Integer> > adjl
            = new ArrayList<List<Integer> >();
 
        for (int i = 0; i < n; i++) {
 
            adjl.add(new ArrayList<Integer>());
        }
 
        for (int[] e : edges) {
            int u = e[0];
            int v = e[1];
            adjl.get(u).add(v);
            adjl.get(v).add(u);
        }
 
        return adjl;
    }
 
    // Function to perform DFS traversal
    private static void DFS(
        List<List<Integer> > adjl,
        int[] parent, int u, int p)
    {
 
        // Initializing parent of each node to p
        parent[u] = p;
 
        // Iterate over the children
        for (int v : adjl.get(u)) {
 
            if (v != p) {
 
                DFS(adjl, parent, v, u);
            }
        }
    }
 
    // Function to add values of children to
    // respective parent nodes
    private static int[] valuesFromChildren(
        int[] parent, int[] values)
    {
 
        int[] valuesChildren
            = new int[parent.length];
 
        for (int i = 0; i < parent.length; i++) {
 
            // Root node
            if (parent[i] == -1)
                continue;
 
            else {
                int p = parent[i];
 
                valuesChildren[p] += values[i];
            }
        }
        return valuesChildren;
    }
 
    // Function to return sum of values of
    // each node in path from V to the root
    private static int findSumOfValues(
        int v, int[] parent,
        int[] valuesChildren)
    {
 
        int cur_node = v;
        int sum = 0;
 
        // Path from node V to root node
        while (cur_node != -1) {
 
            sum += valuesChildren[cur_node];
            cur_node = parent[cur_node];
        }
 
        return sum;
    }
 
    // Driver Code
    public static void main(String[] args)
    {
 
        int n = 8;
 
        // Insert edges into the graph
        int[][] edges = { { 0, 1 },
                          { 0, 2 },
                          { 0, 3 },
                          { 1, 4 },
                          { 1, 5 },
                          { 4, 7 },
                          { 3, 6 } };
 
        int v = 7;
 
        // Values assigned to each vertex
        int[] values = new int[] { 1, 2, 3, 0,
                                   0, 4, 3, 6 };
 
        // Constructing the tree
        // using adjacency list
        List<List<Integer> > adjl
            = constructTree(n, edges);
 
        // Parent array
        int[] parent = new int[n];
 
        // store values in the parent array
        DFS(adjl, parent, 0, -1);
 
        // Add values of children to the parent
        int[] valuesChildren
            = valuesFromChildren(parent, values);
 
        // Find sum of nodes lying in the path
        int sum = findSumOfValues(
            v, parent,
            valuesChildren);
 
        // Add root node since
        // its value is not included yet
        sum += values[0];
 
        System.out.println(sum);
    }
}


Python3




# Python3 program to implement the above approach
 
# Creating Adjacency list
def constructTree(n, edges):
    adjl = []
  
    for i in range(n):
        adjl.append([])
  
    for i in range(len(edges)):
        u = edges[i][0]
        v = edges[i][1]
        adjl[u].append(v)
        adjl[v].append(u)
    return adjl
  
# Function to perform DFS traversal
def DFS(adjl, parent, u, p):
   
    # Initializing parent of each node to p
    parent[u] = p
  
    # Iterate over the children
    for v in adjl[u]:
        if (v != p):
            DFS(adjl, parent, v, u)
  
# Function to add values of children to
# respective parent nodes
def valuesFromChildren(parent, values):
    valuesChildren = [0]*(len(parent))
  
    for i in range(len(parent)):
        # Root node
        if (parent[i] == -1):
            continue
        else:
            p = parent[i]
            valuesChildren[p] += values[i]
    return valuesChildren
  
# Function to return sum of values of
# each node in path from V to the root
def findSumOfValues(v, parent, valuesChildren):
    cur_node = v
    Sum = 0
  
    # Path from node V to root node
    while (cur_node != -1):
        Sum += valuesChildren[cur_node]
        cur_node = parent[cur_node]
    return Sum
 
n = 8
  
# Insert edges into the graph
edges = [ [ 0, 1 ], [ 0, 2 ], [ 0, 3 ], [ 1, 4 ], [ 1, 5 ], [ 4, 7 ], [ 3, 6 ] ]
 
v = 7
 
# Values assigned to each vertex
values = [ 1, 2, 3, 0, 0, 4, 3, 6 ]
 
# Constructing the tree
# using adjacency list
adjl = constructTree(n, edges)
 
# Parent array
parent = [0]*(n)
 
# store values in the parent array
DFS(adjl, parent, 0, -1)
 
# Add values of children to the parent
valuesChildren = valuesFromChildren(parent, values)
 
# Find sum of nodes lying in the path
Sum = findSumOfValues(v, parent, valuesChildren)
 
# Add root node since
# its value is not included yet
Sum += values[0]
 
print(Sum)
 
# This code is contributed by suresh07.


C#




// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Creating Adjacency list
private static List<List<int>> constructTree(int n, int[,] edges)
{
    List<List<int> > adjl = new List<List<int> >();
 
    for(int i = 0; i < n; i++)
    {
         
        adjl.Add(new List<int>());
    }
 
    for(int i = 0; i < edges.GetLength(0); i++)
    {
        int u = edges[i, 0];
        int v = edges[i, 1];
        adjl[u].Add(v);
        adjl[v].Add(u);
    }
 
    return adjl;
}
 
// Function to perform DFS traversal
private static void DFS(List<List<int> > adjl,
                        int[] parent, int u, int p)
{
     
    // Initializing parent of each node to p
    parent[u] = p;
 
    // Iterate over the children
    foreach(int v in adjl[u])
    {
 
        if (v != p)
        {
            DFS(adjl, parent, v, u);
        }
    }
}
 
// Function to add values of children to
// respective parent nodes
private static int[] valuesFromChildren(int[] parent,
                                        int[] values)
{
 
    int[] valuesChildren = new int[parent.Length];
 
    for(int i = 0; i < parent.Length; i++)
    {
         
        // Root node
        if (parent[i] == -1)
            continue;
 
        else
        {
            int p = parent[i];
            valuesChildren[p] += values[i];
        }
    }
    return valuesChildren;
}
 
// Function to return sum of values of
// each node in path from V to the root
private static int findSumOfValues(int v, int[] parent,
                                   int[] valuesChildren)
{
 
    int cur_node = v;
    int sum = 0;
 
    // Path from node V to root node
    while (cur_node != -1)
    {
         
        sum += valuesChildren[cur_node];
        cur_node = parent[cur_node];
    }
    return sum;
}
 
// Driver Code
public static void Main(string[] args)
{
    int n = 8;
 
    // Insert edges into the graph
    int[, ] edges = { { 0, 1 }, { 0, 2 }, { 0, 3 },
                      { 1, 4 }, { 1, 5 }, { 4, 7 },
                      { 3, 6 } };
 
    int v = 7;
 
    // Values assigned to each vertex
    int[] values = new int[] { 1, 2, 3, 0,
                               0, 4, 3, 6 };
 
    // Constructing the tree
    // using adjacency list
    List<List<int>> adjl = constructTree(n, edges);
 
    // Parent array
    int[] parent = new int[n];
 
    // store values in the parent array
    DFS(adjl, parent, 0, -1);
 
    // Add values of children to the parent
    int[] valuesChildren = valuesFromChildren(parent,
                                              values);
 
    // Find sum of nodes lying in the path
    int sum = findSumOfValues(v, parent,
                              valuesChildren);
 
    // Add root node since
    // its value is not included yet
    sum += values[0];
 
    Console.WriteLine(sum);
}
}
 
// This code is contributed by ukasp


Javascript




<script>
 
// Javascript program to implement
// the above approach
 
// Creating Adjacency list
function constructTree(n, edges)
{
    let adjl = [];
    for(let i = 0; i < n; i++)
    {
        adjl.push([]);
    }
 
    for(let e = 0; e < edges.length; e++)
    {
        let u = edges[e][0];
        let v = edges[e][1];
         
        adjl[u].push(v);
        adjl[v].push(u);
    }
    return adjl;
}
 
// Function to perform DFS traversal
function DFS(adjl, parent, u, p)
{
     
    // Initializing parent of each node to p
    parent[u] = p;
 
    // Iterate over the children
    for(let v = 0; v < adjl[u].length; v++)
    {
        if (adjl[u][v] != p)
        {
            DFS(adjl, parent, adjl[u][v], u);
        }
    }
}
 
// Function to add values of children to
// respective parent nodes
function valuesFromChildren(parent, values)
{
    let valuesChildren = new Array(parent.length);
     for(let i = 0; i < parent.length; i++)
    {
        valuesChildren[i] = 0;
    }
    for(let i = 0; i < parent.length; i++)
    {
         
        // Root node
        if (parent[i] == -1)
            continue;
 
        else
        {
            let p = parent[i];
 
            valuesChildren[p] += values[i];
        }
    }
    return valuesChildren;
}
 
// Function to return sum of values of
// each node in path from V to the root
function findSumOfValues(v, parent, valuesChildren)
{
    let cur_node = v;
    let sum = 0;
 
    // Path from node V to root node
    while (cur_node != -1)
    {
        sum += valuesChildren[cur_node];
        cur_node = parent[cur_node];
    }
    return sum;
}
 
// Driver Code
let n = 8;
  
// Insert edges into the graph
let edges = [ [ 0, 1 ], [ 0, 2 ],
              [ 0, 3 ], [ 1, 4 ],
              [ 1, 5 ], [ 4, 7 ],
              [ 3, 6 ] ];
 
let v = 7;
 
// Values assigned to each vertex
let values = [ 1, 2, 3, 0,
               0, 4, 3, 6 ];
 
// Constructing the tree
// using adjacency list
let adjl = constructTree(n, edges);
 
// Parent array
let parent = new Array(n);
for(let i = 0; i < n; i++)
{
    parent[i] = 0;
}
 
// Store values in the parent array
DFS(adjl, parent, 0, -1);
 
// Add values of children to the parent
let valuesChildren = valuesFromChildren(
    parent, values);
 
// Find sum of nodes lying in the path
let sum = findSumOfValues(
          v, parent, valuesChildren);
 
// Add root node since
// its value is not included yet
sum += values[0];
 
document.write(sum);
 
// This code is contributed by avanitrachhadiya2155
 
</script>


Output: 

16

 

Time Complexity: O(N) 
Auxiliary Space: O(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 neveropen!

RELATED ARTICLES

Most Popular

Dominic
32346 POSTS0 COMMENTS
Milvus
87 POSTS0 COMMENTS
Nango Kala
6714 POSTS0 COMMENTS
Nicole Veronica
11877 POSTS0 COMMENTS
Nokonwaba Nkukhwana
11940 POSTS0 COMMENTS
Shaida Kate Naidoo
6835 POSTS0 COMMENTS
Ted Musemwa
7094 POSTS0 COMMENTS
Thapelo Manthata
6789 POSTS0 COMMENTS
Umr Jansen
6791 POSTS0 COMMENTS