Compruebe si un árbol binario consta de un par de Nodes hoja con suma K

Dado un árbol binario y un número entero K , la tarea es comprobar si el árbol consta de un par de Nodes hoja con una suma exactamente K . En caso de múltiples pares, imprima cualquiera de ellos. De lo contrario, imprima -1.

Nota: Suponga que el árbol binario dado siempre tendrá más de 1 Node hoja.

Ejemplos:

Entrada: X = 13

             1
           /   \
          2     3
         / \   / \
        4   5 6   7
               \
                8

Salida: [5, 8]
Explicación: 
El árbol binario dado consta de 4 Nodes hoja [4, 5, 6, 8]. 
El par de Nodes de valor 5 y 8 tienen suma 13.

Entrada: X = 6

           -1        
           /  \
          2    3
         / \   
        4   5 

Salida: [-1]
Explicación: 
El árbol binario dado consta de 3 Nodes hoja [4, 5, 3]. 
No existe un par válido de Nodes cuya suma de sus valores sea igual a 6. 
Por lo tanto, imprima -1.

Enfoque ingenuo: el enfoque más simple para resolver el problema es atravesar el árbol y almacenar todos los Nodes hoja en una array. Luego ordene la array y use la técnica de dos punteros para encontrar si existe o no un par requerido. 

Complejidad temporal: O(NlogN)
Espacio auxiliar: O(N)

Enfoque eficiente: el enfoque anterior se puede optimizar utilizando HashSet . Siga los pasos a continuación para resolver el problema:

  • Cree un conjunto para almacenar valores de Nodes hoja.
  • Atraviese el árbol y para cada Node de hoja, verifique si (K – valor del Node de hoja) existe en el conjunto desordenado o no.
  • Si se encuentra que es verdadero, imprima el par de valores de Node.
  • De lo contrario, almacene el valor del Node actual en el conjunto desordenado.

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

C++

// C++ Program to implement
// the above approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Stores if a pair exists or not
bool pairFound = false;
 
// Struct binary tree node
struct Node {
    int data;
    Node *left, *right;
};
 
// Creates a new node
Node* newNode(int data)
{
    Node* temp = new Node();
    temp->data = data;
    temp->left = temp->right = NULL;
    return temp;
}
 
// Function to check if a pair of leaf
// nodes exists with sum K
void pairSum(Node* root, int target,
             unordered_set<int>& S)
{
    // checks if root is NULL
    if (!root)
        return;
 
    // Checks if the current node is a leaf node
    if (!root->left and !root->right) {
 
        // Checks for a valid pair of leaf nodes
        if (S.count(target - root->data)) {
 
            cout << target - root->data << " "
                 << root->data;
 
            pairFound = true;
            return;
        }
 
        // Insert value of current node
        // into the set
        else
            S.insert(root->data);
    }
 
    // Traverse left and right subtree
    pairSum(root->left, target, S);
    pairSum(root->right, target, S);
}
 
// Driver Code
int main()
{
    // Construct binary tree
    Node* root = newNode(1);
    root->left = newNode(2);
    root->left->left = newNode(4);
    root->left->right = newNode(5);
    root->right = newNode(3);
    root->right->left = newNode(6);
    root->right->right = newNode(7);
 
    root->right->right->right = newNode(8);
 
    // Stores the leaf nodes
    unordered_set<int> S;
 
    int K = 13;
 
    pairSum(root, K, S);
 
    if (pairFound == false)
        cout << "-1";
 
    return 0;
}

Java

// Java program to implement
// the above approach
import java.util.*;
 
class GFG{
 
// Stores if a pair exists or not
static boolean pairFound = false;
 
// Struct binary tree node
static class Node
{
    int data;
    Node left, right;
};
 
// Creates a new node
static Node newNode(int data)
{
    Node temp = new Node();
    temp.data = data;
    temp.left = temp.right = null;
    return temp;
}
 
// Function to check if a pair of leaf
// nodes exists with sum K
static void pairSum(Node root, int target,
                    HashSet<Integer> S)
{
     
    // Checks if root is null
    if (root == null)
        return;
 
    // Checks if the current node is a leaf node
    if (root.left == null && root.right == null)
    {
         
        // Checks for a valid pair of leaf nodes
        if (S.contains(target - root.data))
        {
            System.out.print(target - root.data +
                                " " + root.data);
            pairFound = true;
            return;
        }
 
        // Insert value of current node
        // into the set
        else
            S.add(root.data);
    }
 
    // Traverse left and right subtree
    pairSum(root.left, target, S);
    pairSum(root.right, target, S);
}
 
// Driver Code
public static void main(String[] args)
{
     
    // Construct binary tree
    Node root = newNode(1);
    root.left = newNode(2);
    root.left.left = newNode(4);
    root.left.right = newNode(5);
    root.right = newNode(3);
    root.right.left = newNode(6);
    root.right.right = newNode(7);
    root.right.right.right = newNode(8);
 
    // Stores the leaf nodes
    HashSet<Integer> S = new HashSet<Integer>();
 
    int K = 13;
 
    pairSum(root, K, S);
 
    if (pairFound == false)
        System.out.print("-1");
}
}
 
// This code is contributed by 29AjayKumar

Python3

# Python3 program to implement
# the above approach
 
# Stores if a pair exists or not
pairFound = False
S = set()
 
# Struct binary tree node
class newNode:
     
    def __init__(self, data):
         
        self.data = data
        self.left = None
        self.right = None
 
# Function to check if a pair of
# leaf nodes exists with sum K
def pairSum(root, target):
     
    global pairFound
    global S
     
    # Checks if root is NULL
    if (root == None):
        return
 
    # Checks if the current node
    # is a leaf node
    if (root.left == None and
       root.right == None):
        temp = list(S)
         
        # Checks for a valid pair of leaf nodes
        if (temp.count(target - root.data)):
            print(target - root.data, root.data)
 
            pairFound = True
            return
         
        # Insert value of current node
        # into the set
        else:
            S.add(root.data)
 
    # Traverse left and right subtree
    pairSum(root.left, target)
    pairSum(root.right, target)
 
# Driver Code
if __name__ == '__main__':
     
    # Construct binary tree
    root = newNode(1)
    root.left = newNode(2)
    root.left.left = newNode(4)
    root.left.right = newNode(5)
    root.right = newNode(3)
    root.right.left = newNode(6)
    root.right.right = newNode(7)
    root.right.right.right = newNode(8)
     
    K = 13
 
    pairSum(root, K)
 
    if (pairFound == False):
        print(-1)
         
# This code is contributed by bgangwar59

C#

// C# program to implement
// the above approach
using System;
using System.Collections.Generic;
 
class GFG{
 
// Stores if a pair exists or not
static bool pairFound = false;
 
// Struct binary tree node
class Node
{
    public int data;
    public Node left, right;
};
 
// Creates a new node
static Node newNode(int data)
{
    Node temp = new Node();
    temp.data = data;
    temp.left = temp.right = null;
    return temp;
}
 
// Function to check if a pair of leaf
// nodes exists with sum K
static void pairSum(Node root, int target,
                    HashSet<int> S)
{
     
    // Checks if root is null
    if (root == null)
        return;
 
    // Checks if the current node is a leaf node
    if (root.left == null && root.right == null)
    {
         
        // Checks for a valid pair of leaf nodes
        if (S.Contains(target - root.data))
        {
            Console.Write(target - root.data +
                             " " + root.data);
            pairFound = true;
            return;
        }
 
        // Insert value of current node
        // into the set
        else
            S.Add(root.data);
    }
 
    // Traverse left and right subtree
    pairSum(root.left, target, S);
    pairSum(root.right, target, S);
}
 
// Driver Code
public static void Main(String[] args)
{
     
    // Construct binary tree
    Node root = newNode(1);
    root.left = newNode(2);
    root.left.left = newNode(4);
    root.left.right = newNode(5);
    root.right = newNode(3);
    root.right.left = newNode(6);
    root.right.right = newNode(7);
    root.right.right.right = newNode(8);
 
    // Stores the leaf nodes
    HashSet<int> S = new HashSet<int>();
 
    int K = 13;
 
    pairSum(root, K, S);
 
    if (pairFound == false)
        Console.Write("-1");
}
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
 
    // JavaScript implementation of the above approach
     
    // Stores if a pair exists or not
    let pairFound = false;
 
    // Struct binary tree node
    class Node
    {
        constructor(data) {
           this.left = null;
           this.right = null;
           this.data = data;
        }
    }
 
    // Creates a new node
    function newNode(data)
    {
        let temp = new Node(data);
        return temp;
    }
 
    // Function to check if a pair of leaf
    // nodes exists with sum K
    function pairSum(root, target, S)
    {
 
        // Checks if root is null
        if (root == null)
            return;
 
        // Checks if the current node is a leaf node
        if (root.left == null && root.right == null)
        {
 
            // Checks for a valid pair of leaf nodes
            if (S.has(target - root.data))
            {
                document.write(target - root.data + " " +
                root.data);
                pairFound = true;
                return;
            }
 
            // Insert value of current node
            // into the set
            else
                S.add(root.data);
        }
 
        // Traverse left and right subtree
        pairSum(root.left, target, S);
        pairSum(root.right, target, S);
    }
     
    // Construct binary tree
    let root = newNode(1);
    root.left = newNode(2);
    root.left.left = newNode(4);
    root.left.right = newNode(5);
    root.right = newNode(3);
    root.right.left = newNode(6);
    root.right.right = newNode(7);
    root.right.right.right = newNode(8);
  
    // Stores the leaf nodes
    let S = new Set();
  
    let K = 13;
  
    pairSum(root, K, S);
  
    if (pairFound == false)
        document.write("-1");
     
</script>
Producción: 

5 8

Complejidad temporal: O(N)
Espacio auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por chirags_30 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 *