Encuentre el elemento más cercano en el árbol de búsqueda binaria – Part 1

Dado un árbol de búsqueda binario y un Node objetivo K. La tarea es encontrar el Node con la diferencia mínima absoluta con el valor objetivo dado K.

  

C++

// Recursive C++ program to find key closest to k
// in given Binary Search Tree.
#include<bits/stdc++.h>
using namespace std;
 
/* A binary tree node has key, pointer to left child
and a pointer to right child */
struct Node
{
    int key;
    struct Node* left, *right;
};
 
/* Utility that allocates a new node with the
  given key and NULL left and right pointers. */
struct Node* newnode(int key)
{
    struct Node* node = new (struct Node);
    node->key = key;
    node->left = node->right  = NULL;
    return (node);
}
 
// Function to find node with minimum absolute
// difference with given K
// min_diff   --> minimum difference till now
// min_diff_key  --> node having minimum absolute
//                   difference with K
void maxDiffUtil(struct Node *ptr, int k, int &min_diff,
                                      int &min_diff_key)
{
    if (ptr == NULL)
        return ;
 
    // If k itself is present
    if (ptr->key == k)
    {
        min_diff_key = k;
        return;
    }
 
    // update min_diff and min_diff_key by checking
    // current node value
    if (min_diff > abs(ptr->key - k))
    {
        min_diff = abs(ptr->key - k);
        min_diff_key = ptr->key;
    }
 
    // if k is less than ptr->key then move in
    // left subtree else in right subtree
    if (k < ptr->key)
        maxDiffUtil(ptr->left, k, min_diff, min_diff_key);
    else
        maxDiffUtil(ptr->right, k, min_diff, min_diff_key);
}
 
// Wrapper over maxDiffUtil()
int maxDiff(Node *root, int k)
{
    // Initialize minimum difference
    int min_diff = INT_MAX, min_diff_key = -1;
 
    // Find value of min_diff_key (Closest key
    // in tree with k)
    maxDiffUtil(root, k, min_diff, min_diff_key);
 
    return min_diff_key;
}
 
// Driver program to run the case
int main()
{
    struct Node *root = newnode(9);
    root->left    = newnode(4);
    root->right   = newnode(17);
    root->left->left = newnode(3);
    root->left->right = newnode(6);
    root->left->right->left = newnode(5);
    root->left->right->right = newnode(7);
    root->right->right = newnode(22);
    root->right->right->left = newnode(20);
    int k = 18;
    cout << maxDiff(root, k);
    return 0;
}

Java

// Recursive Java program to find key closest to k
// in given Binary Search Tree.
 
 class solution
 {
      
     static int min_diff, min_diff_key;
       
/*  A binary tree node has key, pointer to left child
and a pointer to right child */
static class Node
{
    int key;
     
     Node  left,  right;
};
  
/*  Utility that allocates a new node with the
  given key and null left and right pointers.  */
 
 static Node  newnode(int key)
{
     
     Node  node = new Node();
    node.key = key;
    node.left = node.right  = null;
    return (node);
}
  
// Function to find node with minimum absolute
// difference with given K
// min_diff   -. minimum difference till now
// min_diff_key  -. node having minimum absolute
//                   difference with K
static void maxDiffUtil(Node  ptr, int k)
{
    if (ptr == null)
        return ;
  
    // If k itself is present
    if (ptr.key == k)
    {
        min_diff_key = k;
        return;
    }
  
    // update min_diff and min_diff_key by checking
    // current node value
    if (min_diff > Math.abs(ptr.key - k))
    {
        min_diff = Math.abs(ptr.key - k);
        min_diff_key = ptr.key;
    }
  
    // if k is less than ptr.key then move in
    // left subtree else in right subtree
    if (k < ptr.key)
        maxDiffUtil(ptr.left, k);
    else
        maxDiffUtil(ptr.right, k);
}
  
// Wrapper over maxDiffUtil()
static int maxDiff(Node  root, int k)
{
    // Initialize minimum difference
    min_diff = 999999999; min_diff_key = -1;
  
    // Find value of min_diff_key (Closest key
    // in tree with k)
    maxDiffUtil(root, k);
  
    return min_diff_key;
}
  
// Driver program to run the case
public static void main(String args[])
{
     
     Node  root = newnode(9);
    root.left    = newnode(4);
    root.right   = newnode(17);
    root.left.left = newnode(3);
    root.left.right = newnode(6);
    root.left.right.left = newnode(5);
    root.left.right.right = newnode(7);
    root.right.right = newnode(22);
    root.right.right.left = newnode(20);
    int k = 18;
    System.out.println( maxDiff(root, k));
     
}
}
//contributed by Arnab Kundu

Python3

# Recursive Python program to find key
# closest to k in given Binary Search Tree.
 
# Utility that allocates a new node with the
# given key and NULL left and right pointers.
class newnode:
 
    # Constructor to create a new node
    def __init__(self, data):
        self.key = data
        self.left = None
        self.right = None
 
# Function to find node with minimum
# absolute difference with given K
# min_diff --> minimum difference till now
# min_diff_key --> node having minimum absolute
#                   difference with K
def maxDiffUtil(ptr, k, min_diff, min_diff_key):
    if ptr == None:
        return
         
    # If k itself is present
    if ptr.key == k:
        min_diff_key[0] = k
        return
 
    # update min_diff and min_diff_key by 
    # checking current node value
    if min_diff > abs(ptr.key - k):
        min_diff = abs(ptr.key - k)
        min_diff_key[0] = ptr.key
 
    # if k is less than ptr->key then move
    # in left subtree else in right subtree
    if k < ptr.key:
        maxDiffUtil(ptr.left, k, min_diff,
                                 min_diff_key)
    else:
        maxDiffUtil(ptr.right, k, min_diff,
                                  min_diff_key)
 
# Wrapper over maxDiffUtil()
def maxDiff(root, k):
     
    # Initialize minimum difference
    min_diff, min_diff_key = 999999999999, [-1]
 
    # Find value of min_diff_key (Closest
    # key in tree with k)
    maxDiffUtil(root, k, min_diff, min_diff_key)
 
    return min_diff_key[0]
 
# Driver Code
if __name__ == '__main__':
    root = newnode(9)
    root.left = newnode(4)
    root.right = newnode(17)
    root.left.left = newnode(3)
    root.left.right = newnode(6)
    root.left.right.left = newnode(5)
    root.left.right.right = newnode(7)
    root.right.right = newnode(22)
    root.right.right.left = newnode(20)
    k = 18
    print(maxDiff(root, k))
 
# This code is contributed by PranchalK

C#

using System;
 
// Recursive C# program to find key closest to k
// in given Binary Search Tree.
 
 public class solution
 {
 
     public static int min_diff, min_diff_key;
 
/*  A binary tree node has key, pointer to left child
and a pointer to right child */
public class Node
{
    public int key;
 
     public Node left, right;
}
 
/*  Utility that allocates a new node with the
  given key and null left and right pointers.  */
 
public static Node newnode(int key)
 {
 
     Node node = new Node();
    node.key = key;
    node.left = node.right = null;
    return (node);
 }
 
// Function to find node with minimum absolute
// difference with given K
// min_diff   -. minimum difference till now
// min_diff_key  -. node having minimum absolute
//                   difference with K
public static void maxDiffUtil(Node ptr, int k)
{
    if (ptr == null)
    {
        return;
    }
 
    // If k itself is present
    if (ptr.key == k)
    {
        min_diff_key = k;
        return;
    }
 
    // update min_diff and min_diff_key by checking
    // current node value
    if (min_diff > Math.Abs(ptr.key - k))
    {
        min_diff = Math.Abs(ptr.key - k);
        min_diff_key = ptr.key;
    }
 
    // if k is less than ptr.key then move in
    // left subtree else in right subtree
    if (k < ptr.key)
    {
        maxDiffUtil(ptr.left, k);
    }
    else
    {
        maxDiffUtil(ptr.right, k);
    }
}
 
// Wrapper over maxDiffUtil()
public static int maxDiff(Node root, int k)
{
    // Initialize minimum difference
    min_diff = 999999999;
    min_diff_key = -1;
 
    // Find value of min_diff_key (Closest key
    // in tree with k)
    maxDiffUtil(root, k);
 
    return min_diff_key;
}
 
// Driver program to run the case
public static void Main(string[] args)
{
 
     Node root = newnode(9);
    root.left = newnode(4);
    root.right = newnode(17);
    root.left.left = newnode(3);
    root.left.right = newnode(6);
    root.left.right.left = newnode(5);
    root.left.right.right = newnode(7);
    root.right.right = newnode(22);
    root.right.right.left = newnode(20);
    int k = 18;
    Console.WriteLine(maxDiff(root, k));
 
}
 }
 
  // This code is contributed by Shrikant13

Publicación traducida automáticamente

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