Predecesor y sucesor en orden para una clave dada en BST

Hay BST dado con el Node raíz con la parte clave solo como número entero. La estructura de cada Node es la siguiente:

C++

struct Node
{
    int key;
    struct Node *left, *right ;
};

Java

static class Node
{
    int key;
    Node left, right ;
};
 
// This code is contributed by gauravrajput1

Python3

class Node:
   
    def __init__(self, key):
       
        self.key = key
        self.left = None
        self.right = None
 
# This code is contributed by harshitkap00r

C#

public class Node
{
    public int key;
    public Node left, right ;
};
 
// This code is contributed by gauravrajput1

Javascript

<script>
 
      class Node {
        constructor() {
          this.key = 0;
          this.left = null;
          this.right = null;
        }
      }
       
 </script>

Necesita encontrar el sucesor y el predecesor en orden de una clave dada. En caso de que la clave dada no se encuentre en BST, devuelva los dos valores dentro de los cuales se encontrará esta clave.

C++

// C++ program to find predecessor and successor in a BST
#include <iostream>
using namespace std;
 
// BST Node
struct Node
{
    int key;
    struct Node *left, *right;
};
 
// This function finds predecessor and successor of key in BST.
// It sets pre and suc as predecessor and successor respectively
void findPreSuc(Node* root, Node*& pre, Node*& suc, int key)
{
    // Base case
    if (root == NULL)  return ;
 
    // If key is present at root
    if (root->key == key)
    {
        // the maximum value in left subtree is predecessor
        if (root->left != NULL)
        {
            Node* tmp = root->left;
            while (tmp->right)
                tmp = tmp->right;
            pre = tmp ;
        }
 
        // the minimum value in right subtree is successor
        if (root->right != NULL)
        {
            Node* tmp = root->right ;
            while (tmp->left)
                tmp = tmp->left ;
            suc = tmp ;
        }
        return ;
    }
 
    // If key is smaller than root's key, go to left subtree
    if (root->key > key)
    {
        suc = root ;
        findPreSuc(root->left, pre, suc, key) ;
    }
    else // go to right subtree
    {
        pre = root ;
        findPreSuc(root->right, pre, suc, key) ;
    }
}
 
// A utility function to create a new BST node
Node *newNode(int item)
{
    Node *temp =  new Node;
    temp->key = item;
    temp->left = temp->right = NULL;
    return temp;
}
 
/* A utility function to insert a new node with given key in BST */
Node* insert(Node* node, int key)
{
    if (node == NULL) return newNode(key);
    if (key < node->key)
        node->left  = insert(node->left, key);
    else
        node->right = insert(node->right, key);
    return node;
}
 
// Driver program to test above function
int main()
{
    int key = 65;    //Key to be searched in BST
 
   /* Let us create following BST
              50
           /     \
          30      70
         /  \    /  \
       20   40  60   80 */
    Node *root = NULL;
    root = insert(root, 50);
    insert(root, 30);
    insert(root, 20);
    insert(root, 40);
    insert(root, 70);
    insert(root, 60);
    insert(root, 80);
 
 
    Node* pre = NULL, *suc = NULL;
 
    findPreSuc(root, pre, suc, key);
    if (pre != NULL)
      cout << "Predecessor is " << pre->key << endl;
    else
      cout << "No Predecessor";
 
    if (suc != NULL)
      cout << "Successor is " << suc->key;
    else
      cout << "No Successor";
    return 0;
}

Java

// Java program to find predecessor
// and successor in a BST
class GFG{
 
// BST Node
static class Node
{
    int key;
    Node left, right;
 
    public Node()
    {}
 
    public Node(int key)
    {
        this.key = key;
        this.left = this.right = null;
    }
};
 
static Node pre = new Node(), suc = new Node();
 
// This function finds predecessor and
// successor of key in BST. It sets pre
// and suc as predecessor and successor
// respectively
static void findPreSuc(Node root, int key)
{
     
    // Base case
    if (root == null)
        return;
 
    // If key is present at root
    if (root.key == key)
    {
         
        // The maximum value in left
        // subtree is predecessor
        if (root.left != null)
        {
            Node tmp = root.left;
            while (tmp.right != null)
                tmp = tmp.right;
                 
            pre = tmp;
        }
 
        // The minimum value in
        // right subtree is successor
        if (root.right != null)
        {
            Node tmp = root.right;
             
            while (tmp.left != null)
                tmp = tmp.left;
                 
            suc = tmp;
        }
        return;
    }
 
    // If key is smaller than
    // root's key, go to left subtree
    if (root.key > key)
    {
        suc = root;
        findPreSuc(root.left, key);
    }
     
    // Go to right subtree
    else
    {
        pre = root;
        findPreSuc(root.right, key);
    }
}
 
// A utility function to insert a
// new node with given key in BST
static Node insert(Node node, int key)
{
    if (node == null)
        return new Node(key);
    if (key < node.key)
        node.left = insert(node.left, key);
    else
        node.right = insert(node.right, key);
         
    return node;
}
 
// Driver code
public static void main(String[] args)
{
     
    // Key to be searched in BST
    int key = 65;
 
    /*
     * Let us create following BST
     *          50
     *         /  \
     *        30   70
     *       /  \ /  \
     *      20 40 60  80
     */
 
    Node root = new Node();
    root = insert(root, 50);
    insert(root, 30);
    insert(root, 20);
    insert(root, 40);
    insert(root, 70);
    insert(root, 60);
    insert(root, 80);
 
    findPreSuc(root, key);
    if (pre != null)
        System.out.println("Predecessor is " + pre.key);
    else
        System.out.println("No Predecessor");
 
    if (suc != null)
        System.out.println("Successor is " + suc.key);
    else
        System.out.println("No Successor");
}
}
 
// This code is contributed by sanjeev2552

Python

# Python program to find predecessor and successor in a BST
 
# A BST node
class Node:
 
    # Constructor to create a new node
    def __init__(self, key):
        self.key  = key
        self.left = None
        self.right = None
 
# This function finds predecessor and successor of key in BST
# It sets pre and suc as predecessor and successor respectively
def findPreSuc(root, key):
 
    # Base Case
    if root is None:
        return
 
    # If key is present at root
    if root.key == key:
 
        # the maximum value in left subtree is predecessor
        if root.left is not None:
            tmp = root.left
            while(tmp.right):
                tmp = tmp.right
            findPreSuc.pre = tmp
 
 
        # the minimum value in right subtree is successor
        if root.right is not None:
            tmp = root.right
            while(temp.left):
                tmp = tmp.left
            findPreSuc.suc = tmp
 
        return
 
    # If key is smaller than root's key, go to left subtree
    if root.key > key :
        findPreSuc.suc = root
        findPreSuc(root.left, key)
 
    else: # go to right subtree
        findPreSuc.pre = root
        findPreSuc(root.right, key)
 
# A utility function to insert a new node in with given key in BST
def insert(node , key):
    if node is None:
        return Node(key)
 
    if key < node.key:
        node.left = insert(node.left, key)
 
    else:
        node.right = insert(node.right, key)
 
    return node
 
 
# Driver program to test above function
key = 65 #Key to be searched in BST
  
""" Let us create following BST
              50
           /     \
          30      70
         /  \    /  \
       20   40  60   80
"""
root = None
root = insert(root, 50)
insert(root, 30);
insert(root, 20);
insert(root, 40);
insert(root, 70);
insert(root, 60);
insert(root, 80);
 
# Static variables of the function findPreSuc
findPreSuc.pre = None
findPreSuc.suc = None
 
findPreSuc(root, key)
 
if findPreSuc.pre is not None:
    print "Predecessor is", findPreSuc.pre.key
 
else:
    print "No Predecessor"
 
if findPreSuc.suc is not None:
    print "Successor is", findPreSuc.suc.key
else:
    print "No Successor"
 
# This code is contributed by Nikhil Kumar Singh(nickzuck_007)

C#

// C# program to find predecessor
// and successor in a BST
using System;
public class GFG
{
 
  // BST Node
  public
 
    class Node
    {
      public
        int key;
      public
        Node left, right;
      public Node()
      {}
 
      public Node(int key)
      {
        this.key = key;
        this.left = this.right = null;
      }
    };
 
  static Node pre = new Node(), suc = new Node();
 
  // This function finds predecessor and
  // successor of key in BST. It sets pre
  // and suc as predecessor and successor
  // respectively
  static void findPreSuc(Node root, int key)
  {
 
    // Base case
    if (root == null)
      return;
 
    // If key is present at root
    if (root.key == key)
    {
 
      // The maximum value in left
      // subtree is predecessor
      if (root.left != null)
      {
        Node tmp = root.left;
        while (tmp.right != null)
          tmp = tmp.right;
 
        pre = tmp;
      }
 
      // The minimum value in
      // right subtree is successor
      if (root.right != null)
      {
        Node tmp = root.right;
 
        while (tmp.left != null)
          tmp = tmp.left;
 
        suc = tmp;
      }
      return;
    }
 
    // If key is smaller than
    // root's key, go to left subtree
    if (root.key > key)
    {
      suc = root;
      findPreSuc(root.left, key);
    }
 
    // Go to right subtree
    else
    {
      pre = root;
      findPreSuc(root.right, key);
    }
  }
 
  // A utility function to insert a
  // new node with given key in BST
  static Node insert(Node node, int key)
  {
    if (node == null)
      return new Node(key);
    if (key < node.key)
      node.left = insert(node.left, key);
    else
      node.right = insert(node.right, key);
 
    return node;
  }
 
  // Driver code
  public static void Main(String[] args)
  {
 
    // Key to be searched in BST
    int key = 65;
 
    /*
     * Let us create following BST
     *          50
     *         /  \
     *        30   70
     *       /  \ /  \
     *      20 40 60  80
     */
 
    Node root = new Node();
    root = insert(root, 50);
    insert(root, 30);
    insert(root, 20);
    insert(root, 40);
    insert(root, 70);
    insert(root, 60);
    insert(root, 80);
 
    findPreSuc(root, key);
    if (pre != null)
      Console.WriteLine("Predecessor is " + pre.key);
    else
      Console.WriteLine("No Predecessor");
 
    if (suc != null)
      Console.WriteLine("Successor is " + suc.key);
    else
      Console.WriteLine("No Successor");
  }
}
 
// This code is contributed by aashish1995

Javascript

<script>
 
// JavaScript program to find predecessor
// and successor in a BST// BST Node
 class Node
{
     constructor(key)
    {
        this.key = key;
        this.left = this.right = null;
    }
}
 
var pre = new Node(), suc = new Node();
 
// This function finds predecessor and
// successor of key in BST. It sets pre
// and suc as predecessor and successor
// respectively
function findPreSuc(root , key)
{
     
    // Base case
    if (root == null)
        return;
 
    // If key is present at root
    if (root.key == key)
    {
         
        // The maximum value in left
        // subtree is predecessor
        if (root.left != null)
        {
            var tmp = root.left;
            while (tmp.right != null)
                tmp = tmp.right;
                 
            pre = tmp;
        }
 
        // The minimum value in
        // right subtree is successor
        if (root.right != null)
        {
            var tmp = root.right;
             
            while (tmp.left != null)
                tmp = tmp.left;
                 
            suc = tmp;
        }
        return;
    }
 
    // If key is smaller than
    // root's key, go to left subtree
    if (root.key > key)
    {
        suc = root;
        findPreSuc(root.left, key);
    }
     
    // Go to right subtree
    else
    {
        pre = root;
        findPreSuc(root.right, key);
    }
}
 
// A utility function to insert a
// new node with given key in BST
function insert(node , key)
{
    if (node == null)
        return new Node(key);
    if (key < node.key)
        node.left = insert(node.left, key);
    else
        node.right = insert(node.right, key);
         
    return node;
}
 
// Driver code
 
  
    // Key to be searched in BST
    var key = 65;
 
    /*
     * Let us create following BST
     *          50
     *         /  \
     *        30   70
     *       /  \ /  \
     *      20 40 60  80
     */
 
    var root = new Node();
    root = insert(root, 50);
    insert(root, 30);
    insert(root, 20);
    insert(root, 40);
    insert(root, 70);
    insert(root, 60);
    insert(root, 80);
 
    findPreSuc(root, key);
    if (pre != null)
        document.write("Predecessor is " + pre.key);
    else
        document.write("No Predecessor");
 
    if (suc != null)
        document.write("<br/>Successor is " + suc.key);
    else
        document.write("<br/>No Successor");
 
// This code contributed by gauravrajput1
 
</script>

C++

// CPP code for inorder successor
// and predecessor of tree
#include<iostream>
#include<stdlib.h>
 
using namespace std;
 
struct Node
{
    int data;
    Node* left,*right;
};
  
// Function to return data
Node* getnode(int info)
{
    Node* p = (Node*)malloc(sizeof(Node));
    p->data = info;
    p->right = NULL;
    p->left = NULL;
    return p;
}
 
/*
since inorder traversal results in
ascending order visit to node , we
can store the values of the largest
no which is smaller than a (predecessor)
and smallest no which is large than
a (successor) using inorder traversal
*/
void find_p_s(Node* root,int a,
              Node** p, Node** q)
{
    // If root is null return
    if(!root)
        return ;
         
    // traverse the left subtree   
    find_p_s(root->left, a, p, q);
     
    // root data is greater than a
    if(root&&root->data > a)
    {
         
        // q stores the node whose data is greater
        // than a and is smaller than the previously
        // stored data in *q which is successor
        if((!*q) || (*q) && (*q)->data > root->data)
                *q = root;
    }
     
    // if the root data is smaller than
    // store it in p which is predecessor
    else if(root && root->data < a)
    {
        *p = root;
    }
     
    // traverse the right subtree
    find_p_s(root->right, a, p, q);
}
 
// Driver code
int main()
{
    Node* root1 = getnode(50);
    root1->left = getnode(20);
    root1->right = getnode(60);
    root1->left->left = getnode(10);
    root1->left->right = getnode(30);
    root1->right->left = getnode(55);
    root1->right->right = getnode(70);
    Node* p = NULL, *q = NULL;
  
    find_p_s(root1, 55, &p, &q);
     
    if(p)
        cout << p->data;
    if(q)
        cout << " " << q->data;
    return 0;
}

Java

// JAVA code for inorder successor
// and predecessor of tree
 
import java.util.*;
 
class GFG{
 
static class Node
{
    int data;
    Node left,right;
};
  
// Function to return data
static Node getnode(int info)
{
    Node p = new Node();
    p.data = info;
    p.right = null;
    p.left = null;
    return p;
}
 
/*
since inorder traversal results in
ascending order visit to node , we
can store the values of the largest
no which is smaller than a (predecessor)
and smallest no which is large than
a (successor) using inorder traversal
*/
static Node p,q;
static void find_p_s(Node root,int a)
{
    // If root is null return
    if(root == null)
        return ;
         
    // traverse the left subtree   
    find_p_s(root.left, a);
     
    // root data is greater than a
    if(root != null && root.data > a)
    {
         
        // q stores the node whose data is greater
        // than a and is smaller than the previously
        // stored data in *q which is successor
        if((q == null) || (q != null) && q.data > root.data)
                q = root;
    }
     
    // if the root data is smaller than
    // store it in p which is predecessor
    else if(root != null && root.data < a)
    {
        p = root;
    }
     
    // traverse the right subtree
    find_p_s(root.right, a);
}
 
// Driver code
public static void main(String[] args)
{
    Node root1 = getnode(50);
    root1.left = getnode(20);
    root1.right = getnode(60);
    root1.left.left = getnode(10);
    root1.left.right = getnode(30);
    root1.right.left = getnode(55);
    root1.right.right = getnode(70);
     p = null;
     q = null;
  
    find_p_s(root1, 55);
     
    if(p != null)
        System.out.print(p.data);
    if(q != null)
        System.out.print(" " +  q.data);
}
}
 
// This code is contributed by Rajput-Ji

Python3

""" Python3 code for inorder successor
and predecessor of tree """
 
# A Binary Tree Node
# Utility function to create a new tree node
class getnode:
 
    # Constructor to create a new node
    def __init__(self, data):
        self.data = data
        self.left = None
        self.right = None
 
"""
since inorder traversal results in
ascendingorder visit to node , we
can store the values of the largest
o which is smaller than a (predecessor)
and smallest no which is large than
a (successor) using inorder traversal
"""
def find_p_s(root, a, p, q):
 
    # If root is None return
    if(not root):
        return
         
    # traverse the left subtree    
    find_p_s(root.left, a, p, q)
     
    # root data is greater than a
    if(root and root.data > a):
         
        # q stores the node whose data is greater
        # than a and is smaller than the previously
        # stored data in *q which is successor
        if((not q[0]) or q[0] and
                q[0].data > root.data):
            q[0] = root
             
    # if the root data is smaller than
    # store it in p which is predecessor
    elif(root and root.data < a):
        p[0]= root
     
    # traverse the right subtree
    find_p_s(root.right, a, p, q)
 
# Driver Code
if __name__ == '__main__':
 
    root1 = getnode(50)
    root1.left = getnode(20)
    root1.right = getnode(60)
    root1.left.left = getnode(10)
    root1.left.right = getnode(30)
    root1.right.left = getnode(55)
    root1.right.right = getnode(70)
    p = [None]
    q = [None]
     
    find_p_s(root1, 55, p, q)
     
    if(p[0]) :
        print(p[0].data, end = "")
    if(q[0]) :
        print("", q[0].data)
 
# This code is contributed by
# SHUBHAMSINGH10

C#

// C# code for inorder successor
// and predecessor of tree
using System;
 
public class GFG {
 
  public class Node {
    public int data;
    public Node left, right;
  };
 
  // Function to return data
  static Node getnode(int info) {
    Node p = new Node();
    p.data = info;
    p.right = null;
    p.left = null;
    return p;
  }
 
  /*
     * since inorder traversal results in ascending order visit to node , we can
     * store the values of the largest no which is smaller than a (predecessor) and
     * smallest no which is large than a (successor) using inorder traversal
     */
  static Node p, q;
 
  static void find_p_s(Node root, int a)
  {
     
    // If root is null return
    if (root == null)
      return;
 
    // traverse the left subtree
    find_p_s(root.left, a);
 
    // root data is greater than a
    if (root != null && root.data > a) {
 
      // q stores the node whose data is greater
      // than a and is smaller than the previously
      // stored data in *q which is successor
      if ((q == null) || (q != null) && q.data > root.data)
        q = root;
    }
 
    // if the root data is smaller than
    // store it in p which is predecessor
    else if (root != null && root.data < a) {
      p = root;
    }
 
    // traverse the right subtree
    find_p_s(root.right, a);
  }
 
  // Driver code
  public static void Main(String[] args) {
    Node root1 = getnode(50);
    root1.left = getnode(20);
    root1.right = getnode(60);
    root1.left.left = getnode(10);
    root1.left.right = getnode(30);
    root1.right.left = getnode(55);
    root1.right.right = getnode(70);
    p = null;
    q = null;
 
    find_p_s(root1, 55);
 
    if (p != null)
      Console.Write(p.data);
    if (q != null)
      Console.Write(" " + q.data);
  }
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
class Node
{
    constructor(data)
    {
        this.data = data;
        this.left = this.right = null;
    }
}
 
function find_p_s(root, a, p, q)
{
    // If root is None return
    if(root == null)
        return
          
    // traverse the left subtree   
    find_p_s(root.left, a, p, q)
      
    // root data is greater than a
    if(root && root.data > a)
    {    
        // q stores the node whose data is greater
        // than a and is smaller than the previously
        // stored data in *q which is successor
        if((q[0] == null) || q[0] != null && q[0].data > root.data)
         
            q[0] = root
              
    }
     
    // if the root data is smaller than
    // store it in p which is predecessor
    else if(root && root.data < a)
    {    p[0] = root
         
     }
      
    // traverse the right subtree
    find_p_s(root.right, a, p, q)
}
 
// Driver Code
let root1 = new Node(50)
root1.left = new Node(20)
root1.right = new Node(60)
root1.left.left = new Node(10)
root1.left.right = new Node(30)
root1.right.left = new Node(55)
root1.right.right = new Node(70)
p = [null]
q = [null]
 
find_p_s(root1, 55, p, q)
 
if(p[0] != null)
    document.write(p[0].data, end = " ")
if(q[0] != null)
    document.write(" ", q[0].data)
 
// This code is contributed by patel2127
</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 *