Suelo y Techo de un BST

Dado un árbol binario y un valor clave (Node), encuentre el valor mínimo y máximo para ese valor clave en particular.

  • Node de valor mínimo : Node con el mayor dato menor o igual que el valor clave. 
  • Node de valor límite : Node con los datos más pequeños mayores o iguales que el valor clave.

Por ejemplo, consideremos el árbol binario a continuación: 

C++

// Program to find ceil of a given value in BST 
#include <bits/stdc++.h> 
using namespace std; 
  
/* A binary tree node has key, left child and right child */
class node { 
public: 
    int key; 
    node* left; 
    node* right; 
}; 
  
/* Helper function that allocates a new node with the given key and 
NULL left and right pointers.*/
node* newNode(int key) 
{ 
    node* Node = new node(); 
    Node->key = key; 
    Node->left = NULL; 
    Node->right = NULL; 
    return (Node); 
} 
  
// Function to find ceil of a given input in BST. If input is more 
// than the max key in BST, return -1 
int Ceil(node* root, int input) 
{ 
    // Base case 
    if (root == NULL) 
        return -1; 
  
    // We found equal key 
    if (root->key == input) 
        return root->key; 
  
    // If root's key is smaller, ceil must be in right subtree 
    if (root->key < input) 
        return Ceil(root->right, input); 
  
    // Else, either left subtree or root has the ceil value 
    int ceil = Ceil(root->left, input); 
    return (ceil >= input) ? ceil : root->key; 
} 
  
// Driver program to test above function 
int main() 
{ 
    node* root = newNode(8); 
  
    root->left = newNode(4); 
    root->right = newNode(12); 
  
    root->left->left = newNode(2); 
    root->left->right = newNode(6); 
  
    root->right->left = newNode(10); 
    root->right->right = newNode(14); 
  
    for (int i = 0; i < 16; i++) 
        cout << i << " " << Ceil(root, i) << endl; 
  
    return 0; 
} 
  
// This code is contributed by rathbhupendra 

C

// Program to find ceil of a given value in BST 
#include <stdio.h> 
#include <stdlib.h> 
  
/* A binary tree node has key, left child and right child */
struct node { 
    int key; 
    struct node* left; 
    struct node* right; 
}; 
  
/* Helper function that allocates a new node with the given key and 
NULL left and right pointers.*/
struct node* newNode(int key) 
{ 
    struct node* node = (struct node*)malloc(sizeof(struct node)); 
    node->key = key; 
    node->left = NULL; 
    node->right = NULL; 
    return (node); 
} 
  
// Function to find ceil of a given input in BST. If input is more 
// than the max key in BST, return -1 
int Ceil(struct node* root, int input) 
{ 
    // Base case 
    if (root == NULL) 
        return -1; 
  
    // We found equal key 
    if (root->key == input) 
        return root->key; 
  
    // If root's key is smaller, ceil must be in right subtree 
    if (root->key < input) 
        return Ceil(root->right, input); 
  
    // Else, either left subtree or root has the ceil value 
    int ceil = Ceil(root->left, input); 
    return (ceil >= input) ? ceil : root->key; 
} 
  
// Driver program to test above function 
int main() 
{ 
    struct node* root = newNode(8); 
  
    root->left = newNode(4); 
    root->right = newNode(12); 
  
    root->left->left = newNode(2); 
    root->left->right = newNode(6); 
  
    root->right->left = newNode(10); 
    root->right->right = newNode(14); 
  
    for (int i = 0; i < 16; i++) 
        printf("%d %d\n", i, Ceil(root, i)); 
  
    return 0; 
} 

Java

// Java program to find ceil of a given value in BST 
  
class Node { 
  
    int data; 
    Node left, right; 
  
    Node(int d) 
    { 
        data = d; 
        left = right = null; 
    } 
} 
  
class BinaryTree { 
  
    Node root; 
  
    // Function to find ceil of a given input in BST. 
    // If input is more than the max key in BST, 
    // return -1 
    int Ceil(Node node, int input) 
    { 
  
        // Base case 
        if (node == null) { 
            return -1; 
        } 
  
        // We found equal key 
        if (node.data == input) { 
            return node.data; 
        } 
  
        // If root's key is smaller, 
        // ceil must be in right subtree 
        if (node.data < input) { 
            return Ceil(node.right, input); 
        } 
  
        // Else, either left subtree or root 
        // has the ceil value 
        int ceil = Ceil(node.left, input); 
  
        return (ceil >= input) ? ceil : node.data; 
    } 
  
    // Driver Code 
    public static void main(String[] args) 
    { 
        BinaryTree tree = new BinaryTree(); 
        tree.root = new Node(8); 
        tree.root.left = new Node(4); 
        tree.root.right = new Node(12); 
        tree.root.left.left = new Node(2); 
        tree.root.left.right = new Node(6); 
        tree.root.right.left = new Node(10); 
        tree.root.right.right = new Node(14); 
        for (int i = 0; i < 16; i++) { 
  
            System.out.println(i + " " + tree.Ceil(tree.root, i)); 
        } 
    } 
} 
  
// This code has been contributed by Mayank Jaiswal 

Python

# Python program to find ceil of a given value in BST 
  
# A Binary tree node 
class Node: 
      
    # Constructor to create a new node 
    def __init__(self, data): 
        self.key = data 
        self.left = None
        self.right = None
  
# Function to find ceil of a given input in BST. If input 
# is more than the max key in BST, return -1 
def ceil(root, inp): 
      
    # Base Case 
    if root == None: 
        return -1
      
    # We found equal key 
    if root.key == inp : 
        return root.key 
      
    # If root's key is smaller, ceil must be in right subtree 
    if root.key < inp: 
        return ceil(root.right, inp) 
      
    # Else, either left subtree or root has the ceil value 
    val = ceil(root.left, inp) 
    return val if val >= inp else root.key 
  
# Driver program to test above function 
root = Node(8) 
  
root.left = Node(4) 
root.right = Node(12) 
  
root.left.left = Node(2) 
root.left.right = Node(6) 
  
root.right.left = Node(10) 
root.right.right = Node(14) 
  
for i in range(16): 
    print "% d % d" %(i, ceil(root, i)) 
  
# This code is contributed by Nikhil Kumar Singh(nickzuck_007) 

C#

using System; 
  
// C# program to find ceil of a given value in BST 
  
public class Node { 
  
    public int data; 
    public Node left, right; 
  
    public Node(int d) 
    { 
        data = d; 
        left = right = null; 
    } 
} 
  
public class BinaryTree { 
  
    public static Node root; 
  
    // Function to find ceil of a given input in BST. If input is more 
    // than the max key in BST, return -1 
    public virtual int Ceil(Node node, int input) 
    { 
  
        // Base case 
        if (node == null) { 
            return -1; 
        } 
  
        // We found equal key 
        if (node.data == input) { 
            return node.data; 
        } 
  
        // If root's key is smaller, ceil must be in right subtree 
        if (node.data < input) { 
            return Ceil(node.right, input); 
        } 
  
        // Else, either left subtree or root has the ceil value 
        int ceil = Ceil(node.left, input); 
        return (ceil >= input) ? ceil : node.data; 
    } 
  
    // Driver program to test the above functions 
    public static void Main(string[] args) 
    { 
        BinaryTree tree = new BinaryTree(); 
        BinaryTree.root = new Node(8); 
        BinaryTree.root.left = new Node(4); 
        BinaryTree.root.right = new Node(12); 
        BinaryTree.root.left.left = new Node(2); 
        BinaryTree.root.left.right = new Node(6); 
        BinaryTree.root.right.left = new Node(10); 
        BinaryTree.root.right.right = new Node(14); 
        for (int i = 0; i < 16; i++) { 
            Console.WriteLine(i + " " + tree.Ceil(root, i)); 
        } 
    } 
} 
  
// This code is contributed by Shrikant13 

Javascript

<script>
  
// Javascript program to find ceil 
// of a given value in BST
      
    class Node
    {
      
        constructor(x) {
            this.data = x;
            this.left = null;
            this.right = null;
          }
    }
      
    let root;
      
    // Function to find ceil of 
    // a given input in BST.
    // If input is more than the max
    // key in BST,
    // return -1
    function Ceil(node,input)
    {
        // Base case
        if (node == null) {
            return -1;
        }
   
        // We found equal key
        if (node.data == input) {
            return node.data;
        }
   
        // If root's key is smaller,
        // ceil must be in right subtree
        if (node.data < input) {
            return Ceil(node.right, input);
        }
   
        // Else, either left subtree or root
        // has the ceil value
        let ceil = Ceil(node.left, input);
   
        return (ceil >= input) ? ceil : node.data;
    }
      
    // Driver Code
    root =new Node(8)
   
    root.left =new Node(4)
    root.right =new Node(12)
   
    root.left.left =new Node(2)
    root.left.right =new Node(6)
   
    root.right.left =new Node(10)
    root.right.right =new Node(14)
      
    for (let i = 0; i < 16; i++) {
   
        document.write(i + " " + Ceil(root, i)+"<br>");
    }
      
      
    // This code is contributed by unknown2108
      
</script>

C++

// Program to find floor of a given value in BST
#include <bits/stdc++.h>
using namespace std;
  
/* A binary tree node has key, left child and right child */
class node
{
public:
    int key;
    node *left;
    node *right;
};
  
/* Helper function that allocates a new node with the given key and
NULL left and right pointers.*/
node *newNode(int key)
{
    node *Node = new node();
    Node->key = key;
    Node->left = NULL;
    Node->right = NULL;
    return (Node);
}
  
// Function to find floor of a given input in BST. If input is more
// than the min key in BST, return -1
int Floor(node *root, int input)
{
    // Base case
    if (root == NULL)
        return -1;
  
    // We found equal key
    if (root->key == input)
        return root->key;
  
    // If root's key is larger, floor must be in left subtree
    if (root->key > input)
        return Floor(root->left, input);
  
    // Else, either right subtree or root has the floor value
    else{
        int floor = Floor(root->right, input);
        // exception for -1 because it is being returned in base case
        return (floor<=input && floor!=-1)? floor : root->key; 
    }
} 
  
// Driver program to test above function
int main()
{
    node *root = newNode(8);
  
    root->left = newNode(4);
    root->right = newNode(12);
  
    root->left->left = newNode(2);
    root->left->right = newNode(6);
  
    root->right->left = newNode(10);
    root->right->right = newNode(14);
  
    for (int i = 0; i < 16; i++)
        cout << i << " " << Floor(root, i) << endl;
  
    return 0;
}
  
// This code is contributed by rathbhupendra

C++

// C++ program to find floor and ceil of a given key in BST 
#include <bits/stdc++.h> 
using namespace std; 
  
/* A binary tree node has key, left child and right child */
struct Node { 
    int data; 
    Node *left, *right; 
  
    Node(int value) 
    { 
        data = value; 
        left = right = NULL; 
    } 
}; 
  
// Helper function to find floor and ceil of a given key in BST 
void floorCeilBSTHelper(Node* root, int key, int& floor, int& ceil) 
{ 
  
    while (root) { 
  
        if (root->data == key) { 
            ceil = root->data; 
            floor = root->data; 
            return; 
        } 
  
        if (key > root->data) { 
            floor = root->data; 
            root = root->right; 
        } 
        else { 
            ceil = root->data; 
            root = root->left; 
        } 
    } 
    return; 
} 
  
// Display the floor and ceil of a given key in BST. 
// If key is less than the min key in BST, floor will be -1; 
// If key is more than the max key in BST, ceil will be -1; 
void floorCeilBST(Node* root, int key) 
{ 
  
    // Variables 'floor' and 'ceil' are passed by reference 
    int floor = -1, ceil = -1; 
  
    floorCeilBSTHelper(root, key, floor, ceil); 
  
    cout << key << ' ' << floor << ' ' << ceil << '\n'; 
} 
  
// Driver program to test above function 
int main() 
{ 
    Node* root = new Node(8); 
  
    root->left = new Node(4); 
    root->right = new Node(12); 
  
    root->left->left = new Node(2); 
    root->left->right = new Node(6); 
  
    root->right->left = new Node(10); 
    root->right->right = new Node(14); 
  
    for (int i = 0; i < 16; i++) 
        floorCeilBST(root, i); 
  
    return 0; 
} 

Java

// Java program to find floor and ceil 
// of a given key in BST 
import java.io.*;
  
// A binary tree node has key, 
// left child and right child
class Node
{
    int data;
    Node left, right;
  
    Node(int d)
    {
        data = d;
        left = right = null;
    }
}
  
class BinaryTree{
      
Node root;
int floor;
int ceil;
  
// Helper function to find floor and 
// ceil of a given key in BST 
public void floorCeilBSTHelper(Node root, 
                               int key)
{
    while (root != null)
    {
        if (root.data == key) 
        {
            ceil = root.data;
            floor = root.data;
            return;
        }
  
        if (key > root.data)
        {
            floor = root.data;
            root = root.right;
        }
        else
        {
            ceil = root.data;
            root = root.left;
        }
    }
    return;
}
  
// Display the floor and ceil of a 
// given key in BST. If key is less
// than the min key in BST, floor 
// will be -1; If key is more than 
// the max key in BST, ceil will be -1; 
public void floorCeilBST(Node root, int key)
{
      
    // Variables 'floor' and 'ceil' 
    // are passed by reference 
    floor = -1;
    ceil = -1;
  
    floorCeilBSTHelper(root, key);
  
    System.out.println(key + " " + 
                     floor + " " + ceil);
}
  
// Driver code
public static void main(String[] args)
{
    BinaryTree tree = new BinaryTree();
    tree.root = new Node(8);
    tree.root.left = new Node(4);
    tree.root.right = new Node(12);
    tree.root.left.left = new Node(2);
    tree.root.left.right = new Node(6);
    tree.root.right.left = new Node(10);
    tree.root.right.right = new Node(14);
      
    for(int i = 0; i < 16; i++) 
    {
        tree.floorCeilBST(tree.root, i);
    }
}
}
  
// This code is contributed by RohitOberoi

Python3

# Python3 program to find floor and
# ceil of a given key in BST
  
# A binary tree node has key, 
#. left child and right child 
class Node:
      
    def __init__(self, x):
          
        self.data = x
        self.left = None
        self.right = None
  
# Helper function to find floor and
# ceil of a given key in BST
def floorCeilBSTHelper(root, key):
      
    global floor, ceil
  
    while (root):
        if (root.data == key):
            ceil = root.data
            floor = root.data
            return
        if (key > root.data):
            floor = root.data
            root = root.right
        else:
            ceil = root.data
            root = root.left
  
# Display the floor and ceil of a given 
# key in BST. If key is less than the min
# key in BST, floor will be -1; If key is 
# more than the max key in BST, ceil will be -1;
def floorCeilBST(root, key):
      
    global floor, ceil
  
    # Variables 'floor' and 'ceil' 
    # are passed by reference
    floor = -1
    ceil = -1
  
    floorCeilBSTHelper(root, key)
  
    print(key, floor, ceil)
  
# Driver code
if __name__ == '__main__':
      
    floor, ceil = -1, -1
      
    root = Node(8)
    root.left = Node(4)
    root.right = Node(12)
    root.left.left = Node(2)
    root.left.right = Node(6)
    root.right.left = Node(10)
    root.right.right = Node(14)
  
    for i in range(16):
        floorCeilBST(root, i)
  
# This code is contributed by mohit kumar 29

C#

// C# program to find floor and ceil 
// of a given key in BST
using System;
  
// A binary tree node has key, 
// left child and right child
public class Node 
{ 
    public int data; 
    public Node left, right; 
   
    public Node(int d) 
    { 
        data = d; 
        left = right = null; 
    } 
} 
  
public class BinaryTree{
  
public static Node root;
int floor;
int ceil;
  
// Helper function to find floor and 
// ceil of a given key in BST
public int floorCeilBSTHelper(Node root, int key) 
{
    while (root != null)
    {
        if (root.data == key) 
        {
            ceil = root.data;
            floor = root.data;
            return 0;
        }
  
        if (key > root.data)
        {
            floor = root.data;
            root = root.right;
        }
        else    
        {
            ceil = root.data;
            root = root.left;
        }
    }
    return 0;
}
  
// Display the floor and ceil of a 
// given key in BST. If key is less
// than the min key in BST, floor 
// will be -1; If key is more than 
// the max key in BST, ceil will be -1; 
public void floorCeilBST(Node root, int key)
{
      
    // Variables 'floor' and 'ceil' 
    // are passed by reference 
    floor = -1;
    ceil = -1;
      
    floorCeilBSTHelper(root, key);
      
    Console.WriteLine(key + " " + floor +
                            " " + ceil);
}
  
// Driver code
static public void Main()
{
    BinaryTree tree = new BinaryTree();
    BinaryTree.root = new Node(8);
    BinaryTree.root.left = new Node(4);
    BinaryTree.root.right = new Node(12);
    BinaryTree.root.left.left = new Node(2);
    BinaryTree.root.left.right = new Node(6);
    BinaryTree.root.right.left = new Node(10);
    BinaryTree.root.right.right = new Node(14);
      
    for(int i = 0; i < 16; i++)
    {
        tree.floorCeilBST(BinaryTree.root, i);
    }
}
}
  
// This code is contributed by avanitrachhadiya2155

Javascript

<script>
  
// Javascript program to find floor and ceil 
// of a given key in BST
  
// A binary tree node has key, 
// left child and right child
class Node 
{ 
    constructor(d)
    {
        this.data = d;
        this.left = null;
        this.right = null;
    }
} 
  
var root = null;
var floor;
var ceil;
  
// Helper function to find floor and 
// ceil of a given key in BST
function floorCeilBSTHelper(root, key) 
{
    while (root != null)
    {
        if (root.data == key) 
        {
            ceil = root.data;
            floor = root.data;
            return 0;
        }
  
        if (key > root.data)
        {
            floor = root.data;
            root = root.right;
        }
        else    
        {
            ceil = root.data;
            root = root.left;
        }
    }
    return 0;
}
  
// Display the floor and ceil of a 
// given key in BST. If key is less
// than the min key in BST, floor 
// will be -1; If key is more than 
// the max key in BST, ceil will be -1; 
function floorCeilBST(root, key)
{
      
    // Variables 'floor' and 'ceil' 
    // are passed by reference 
    floor = -1;
    ceil = -1;
      
    floorCeilBSTHelper(root, key);
      
    document.write(key + " " + floor +
                            " " + ceil + "<br>");
}
  
// Driver code
root = new Node(8);
root.left = new Node(4);
root.right = new Node(12);
root.left.left = new Node(2);
root.left.right = new Node(6);
root.right.left = new Node(10);
root.right.right = new Node(14);
  
for(var i = 0; i < 16; i++)
{
    floorCeilBST(root, i);
}
  
// This code is contributed by rrrtnx.
</script>

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 *