Consultas para calcular la suma de la ruta desde la raíz hasta un Node dado en un árbol binario dado

Dado un árbol binario infinito completo con raíz en el Node 1 , donde cada i -ésimo Node tiene dos hijos, con valores 2 * i y 2 * (i + 1) . Dada otra array arr[] que consiste en N enteros positivos, la tarea para cada elemento de la array arr[i] es encontrar la suma de los valores de Node que ocurren en una ruta desde el Node raíz hasta el Node arr[i] .

Ejemplos:

Entrada: arr[] = {3, 10}
Salida: 4 18
Explicación:
Node 3: La ruta es 3 -> 1. Por lo tanto, la suma de la ruta es 4.
Node 10: La ruta es 10 -> 5 -> 2 -> 1. Por lo tanto, la suma de los Nodes es 18.

Entrada: arr[] = {1, 4, 20}
Salida: 1 7 38
Explicación:
Node 1: La ruta es 1. Por lo tanto, la suma de la ruta es 1.
Node 4: La ruta es 4 -> 2 -> 1. Por lo tanto, la suma de los Nodes es 7.
Node 20: El camino es 20 -> 10 -> 5 -> 2 -> 1. Por lo tanto, la suma de los Nodes es 38.

Enfoque ingenuo: el enfoque más simple es realizar DFS Traversal para cada elemento de array arr[i] para encontrar su ruta desde el Node actual hasta la raíz e imprimir la suma de los valores de Node en esa ruta. 
Complejidad Temporal: O(N * H), donde H es la altura máxima del árbol.
Espacio Auxiliar: O(H)

Enfoque eficiente: el enfoque anterior también se puede optimizar en función de la observación de que el padre del Node con valor N contiene el valor N/2 . Siga los pasos a continuación para resolver el problema:

  • Inicialice una variable, digamos sumOfNode , para almacenar la suma de Nodes en una ruta.
  • Recorra la array arr[i] y realice los siguientes pasos:
    • Para cada elemento arr[i] , actualice el valor de sumOfNode como sumOfNode + X y actualice arr[i] como arr[i] / 2 .
    • Repita los pasos anteriores mientras arr[i] sea mayor que 0 .
    • Imprime el valor de sumOfNode como resultado para cada elemento de array arr[i] .

A continuación se muestra la implementación del enfoque anterior:

C++

// C++ program for the above approach
#include <iostream>
#include <vector>
using namespace std;
 
// Function to find the sum of the
// path from root to the current node
void sumOfNodeInAPath(int node_value)
{
    // Sum of nodes in the path
    int sum_of_node = 0;
 
    // Iterate until root is reached
    while (node_value) {
 
        sum_of_node += node_value;
 
        // Update the node value
        node_value /= 2;
    }
 
    // Print the resultant sum
    cout << sum_of_node;
 
    return;
}
 
// Function to print the path
// sum for each query
void findSum(vector<int> Q)
{
    // Traverse the queries
    for (int i = 0; i < Q.size(); i++) {
 
        int node_value = Q[i];
 
        sumOfNodeInAPath(node_value);
 
        cout << " ";
    }
}
 
// Driver Code
int main()
{
    vector<int> arr = { 1, 5, 20, 100 };
    findSum(arr);
 
    return 0;
}

Java

/*package whatever //do not write package name here */
 
import java.io.*;
import java.util.ArrayList;
class GFG {
 
  // Function to find the sum of the
  // path from root to the current node
  public static void sumOfNodeInAPath(int node_value)
  {
    // Sum of nodes in the path
    int sum_of_node = 0;
 
    // Iterate until root is reached
    while (node_value > 0) {
 
      sum_of_node += node_value;
 
      // Update the node value
      node_value /= 2;
    }
 
    // Print the resultant sum
    System.out.print(sum_of_node);
  }
 
  // Function to print the path
  // sum for each query
  public static void findSum(ArrayList<Integer> Q)
  {
    // Traverse the queries
    for (int i = 0; i < Q.size(); i++) {
 
      int node_value = Q.get(i);
 
      sumOfNodeInAPath(node_value);
 
      System.out.print(" ");
    }
  }
 
  // Driver Code
  public static void main(String[] args)
  {
    // arraylist to store integers
    ArrayList<Integer> arr = new ArrayList<>();
    arr.add(1);
    arr.add(5);
    arr.add(20);
    arr.add(100);
    findSum(arr);
  }
}
 
// This code is contributed by aditya7409.

Python3

# Python program for the above approach
 
# Function to find the sum of the
# path from root to the current node
def sumOfNodeInAPath(node_value):
     
    # Sum of nodes in the path
    sum_of_node = 0
     
    # Iterate until root is reached
    while (node_value):
         
        sum_of_node += node_value
         
        # Update the node value
        node_value //= 2
         
    # Print the resultant sum
    print(sum_of_node, end = " ")
     
# Function to print the path
# sum for each query
def findSum(Q):
     
    # Traverse the queries
    for i in range(len(Q)):
        node_value = Q[i]
        sumOfNodeInAPath(node_value)
        print(end = "")
 
# Driver Code
arr = [1, 5, 20, 100]
findSum(arr)
 
# This code is contributed by shubhamsingh10

C#

// C# program for the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
  // Function to find the sum of the
  // path from root to the current node
  public static void sumOfNodeInAPath(int node_value)
  {
     
    // Sum of nodes in the path
    int sum_of_node = 0;
 
    // Iterate until root is reached
    while (node_value > 0) {
 
      sum_of_node += node_value;
 
      // Update the node value
      node_value /= 2;
    }
 
    // Print the resultant sum
    Console.Write(sum_of_node);
  }
 
  // Function to print the path
  // sum for each query
  public static void findSum(List<int> Q)
  {
    // Traverse the queries
    for (int i = 0; i < Q.Count ; i++) {
 
      int node_value = Q[i];
      sumOfNodeInAPath(node_value);
      Console.Write(" ");
    }
  }
 
// Driver Code
static public void Main()
{
   
    // arraylist to store integers
    List<int> arr = new List<int>();
    arr.Add(1);
    arr.Add(5);
    arr.Add(20);
    arr.Add(100);
    findSum(arr);
}
}
// This code is contributed by sanjoy_62.

Javascript

<script>
 
// JavaScript program to count frequencies of array items
 
// Function to find the sum of the
// path from root to the current node
function sumOfNodeInAPath(node_value)
{
    // Sum of nodes in the path
    let sum_of_node = 0;
 
    // Iterate until root is reached
    while (node_value) {
 
        sum_of_node += node_value;
 
        // Update the node value
        node_value = Math.floor(node_value / 2 );
    }
 
    // Print the resultant sum
    document.write(sum_of_node);
 
    return;
}
 
// Function to print the path
// sum for each query
function findSum( Q)
{
    // Traverse the queries
    for (let i = 0; i < Q.length; i++) {
 
        let node_value = Q[i];
 
        sumOfNodeInAPath(node_value);
 
        document.write(" ");
    }
}
 
 
// Driver Code
 
let arr = [ 1, 5, 20, 100 ];
findSum(arr);
 
</script>
Producción: 

1 8 38 197

 

Complejidad temporal: O(N*log X), donde X es el elemento máximo del arreglo .
Espacio Auxiliar: O(1)

Publicación traducida automáticamente

Artículo escrito por nk14646 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *