K’th Elemento más grande en BST cuando no se permite la modificación a BST

Dado un árbol de búsqueda binaria (BST) y un número entero positivo k, encuentre el k-ésimo elemento más grande en el árbol de búsqueda binaria. 
Por ejemplo, en el siguiente BST, si k = 3, la salida debería ser 14, y si k = 5, la salida debería ser 10. 

C++

// C++ program to find k'th largest element in BST
#include<bits/stdc++.h>
using namespace std;
  
struct Node
{
    int key;
    Node *left, *right;
};
  
// 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 function to find k'th largest element in a given tree.
void kthLargestUtil(Node *root, int k, int &c)
{
    // Base cases, the second condition is important to
    // avoid unnecessary recursive calls
    if (root == NULL || c >= k)
        return;
  
    // Follow reverse inorder traversal so that the
    // largest element is visited first
    kthLargestUtil(root->right, k, c);
  
    // Increment count of visited nodes
    c++;
  
    // If c becomes k now, then this is the k'th largest 
    if (c == k)
    {
        cout << "K'th largest element is "
             << root->key << endl;
        return;
    }
  
    // Recur for left subtree
    kthLargestUtil(root->left, k, c);
}
  
// Function to find k'th largest element
void kthLargest(Node *root, int k)
{
    // Initialize count of nodes visited as 0
    int c = 0;
  
    // Note that c is passed by reference
    kthLargestUtil(root, k, c);
}
  
/* A utility function to insert a new node with given key in BST */
Node* insert(Node* node, int key)
{
    /* If the tree is empty, return a new node */
    if (node == NULL) return newNode(key);
  
    /* Otherwise, recur down the tree */
    if (key < node->key)
        node->left  = insert(node->left, key);
    else if (key > node->key)
        node->right = insert(node->right, key);
  
    /* return the (unchanged) node pointer */
    return node;
}
  
// Driver Program to test above functions
int main()
{
    /* 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);
  
    int c = 0;
    for (int k=1; k<=7; k++)
        kthLargest(root, k);
  
    return 0;
}

Java

// Java code to find k'th largest element in BST
  
// A binary tree node
class Node {
  
    int data;
    Node left, right;
  
    Node(int d)
    {
        data = d;
        left = right = null;
    }
}
  
class BinarySearchTree {
  
    // Root of BST
    Node root;
  
    // Constructor
    BinarySearchTree()
    {
        root = null;
    }
      
    // function to insert nodes
    public void insert(int data)
    {
        this.root = this.insertRec(this.root, data);
    }
      
    /* A utility function to insert a new node 
    with given key in BST */
    Node insertRec(Node node, int data)
    {   
        /* If the tree is empty, return a new node */
        if (node == null) {
            this.root = new Node(data);
            return this.root;
        }
  
        if (data == node.data) {
            return node;
        }
          
        /* Otherwise, recur down the tree */
        if (data < node.data) {
            node.left = this.insertRec(node.left, data);
        } else {
            node.right = this.insertRec(node.right, data);
        }
        return node;
    }
  
    // class that stores the value of count
    public class count {
        int c = 0;
    }
  
    // utility function to find kth largest no in 
    // a given tree
    void kthLargestUtil(Node node, int k, count C)
    {
        // Base cases, the second condition is important to
        // avoid unnecessary recursive calls
        if (node == null || C.c >= k)
            return;
          
        // Follow reverse inorder traversal so that the
        // largest element is visited first
        this.kthLargestUtil(node.right, k, C); 
          
        // Increment count of visited nodes
        C.c++;
          
        // If c becomes k now, then this is the k'th largest 
        if (C.c == k) {
            System.out.println(k + "th largest element is " + 
                                                 node.data);
            return;
        }
          
        // Recur for left subtree
        this.kthLargestUtil(node.left, k, C); 
    }
  
    // Method to find the kth largest no in given BST
    void kthLargest(int k)
    {
        count c = new count(); // object of class count
        this.kthLargestUtil(this.root, k, c);
    }
  
    // Driver function
    public static void main(String[] args)
    {
        BinarySearchTree tree = new BinarySearchTree();
          
        /* Let us create following BST
              50
           /     \
          30      70
         /  \    /  \
       20   40  60   80 */
        tree.insert(50);
        tree.insert(30);
        tree.insert(20);
        tree.insert(40);
        tree.insert(70);
        tree.insert(60);
        tree.insert(80);
  
        for (int i = 1; i <= 7; i++) {
            tree.kthLargest(i);
        }
    }
}
  
// This code is contributed by Kamal Rawal

Python3

# Python3 program to find k'th largest 
# element in BST 
  
class Node: 
  
    # Constructor to create a new node 
    def __init__(self, data): 
        self.key = data 
        self.left = None
        self.right = None
          
# A function to find k'th largest 
# element in a given tree. 
def kthLargestUtil(root, k, c):
      
    # Base cases, the second condition 
    # is important to avoid unnecessary
    # recursive calls 
    if root == None or c[0] >= k: 
        return
  
    # Follow reverse inorder traversal 
    # so that the largest element is 
    # visited first 
    kthLargestUtil(root.right, k, c)
  
    # Increment count of visited nodes 
    c[0] += 1
  
    # If c becomes k now, then this is 
    # the k'th largest 
    if c[0] == k:
        print("K'th largest element is", 
                               root.key) 
        return
  
    # Recur for left subtree 
    kthLargestUtil(root.left, k, c)
  
# Function to find k'th largest element 
def kthLargest(root, k):
      
    # Initialize count of nodes
    # visited as 0 
    c = [0]
  
    # Note that c is passed by reference 
    kthLargestUtil(root, k, c)
  
# A utility function to insert a new 
# node with given key in BST */
def insert(node, key): 
      
    # If the tree is empty, 
    # return a new node 
    if node == None:
        return Node(key) 
  
    # Otherwise, recur down the tree 
    if key < node.key: 
        node.left = insert(node.left, key) 
    elif key > node.key:
        node.right = insert(node.right, key) 
  
    # return the (unchanged) node pointer 
    return node
  
# Driver Code
if __name__ == '__main__':
      
    # 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)
  
    for k in range(1,8):
        kthLargest(root, k)
          
# This code is contributed by PranchalK

C#

using System;
  
// C# code to find k'th largest element in BST 
  
// A binary tree node 
public class Node
{
  
    public int data;
    public Node left, right;
  
    public Node(int d)
    {
        data = d;
        left = right = null;
    }
}
  
public class BinarySearchTree
{
  
    // Root of BST 
    public Node root;
  
    // Constructor 
    public BinarySearchTree()
    {
        root = null;
    }
  
    // function to insert nodes 
    public virtual void insert(int data)
    {
        this.root = this.insertRec(this.root, data);
    }
  
    /* A utility function to insert a new node  
    with given key in BST */
    public virtual Node insertRec(Node node, int data)
    {
        /* If the tree is empty, return a new node */
        if (node == null)
        {
            this.root = new Node(data);
            return this.root;
        }
  
        if (data == node.data)
        {
            return node;
        }
  
        /* Otherwise, recur down the tree */
        if (data < node.data)
        {
            node.left = this.insertRec(node.left, data);
        }
        else
        {
            node.right = this.insertRec(node.right, data);
        }
        return node;
    }
  
    // class that stores the value of count 
    public class count
    {
        private readonly BinarySearchTree outerInstance;
  
        public count(BinarySearchTree outerInstance)
        {
            this.outerInstance = outerInstance;
        }
  
        internal int c = 0;
    }
  
    // utility function to find kth largest no in  
    // a given tree 
    public virtual void kthLargestUtil(Node node, int k, count C)
    {
        // Base cases, the second condition is important to 
        // avoid unnecessary recursive calls 
        if (node == null || C.c >= k)
        {
            return;
        }
  
        // Follow reverse inorder traversal so that the 
        // largest element is visited first 
        this.kthLargestUtil(node.right, k, C);
  
        // Increment count of visited nodes 
        C.c++;
  
        // If c becomes k now, then this is the k'th largest  
        if (C.c == k)
        {
            Console.WriteLine(k + "th largest element is " + node.data);
            return;
        }
  
        // Recur for left subtree 
        this.kthLargestUtil(node.left, k, C);
    }
  
    // Method to find the kth largest no in given BST 
    public virtual void kthLargest(int k)
    {
        count c = new count(this); // object of class count
        this.kthLargestUtil(this.root, k, c);
    }
  
    // Driver function 
    public static void Main(string[] args)
    {
        BinarySearchTree tree = new BinarySearchTree();
  
        /* Let us create following BST 
              50 
           /     \ 
          30      70 
         /  \    /  \ 
       20   40  60   80 */
        tree.insert(50);
        tree.insert(30);
        tree.insert(20);
        tree.insert(40);
        tree.insert(70);
        tree.insert(60);
        tree.insert(80);
  
        for (int i = 1; i <= 7; i++)
        {
            tree.kthLargest(i);
        }
    }
}
  
  // This code is contributed by Shrikant13

Javascript

<script>
// javascript code to find k'th largest element in BST
  
// A binary tree node
class Node {
  
   constructor(d)
    {
        this.data = d;
        this.left = this.right = null;
    }
}
  
  
  
    // Root of BST
    var root = null;
  
    // Constructor
     
      
    // function to insert nodes
    function insert(data)
    {
        this.root = this.insertRec(this.root, data);
    }
      
    /* A utility function to insert a new node 
    with given key in BST */
    function insertRec( node , data)
    {   
        /* If the tree is empty, return a new node */
        if (node == null) {
            this.root = new Node(data);
            return this.root;
        }
  
        if (data == node.data) {
            return node;
        }
          
        /* Otherwise, recur down the tree */
        if (data < node.data) {
            node.left = this.insertRec(node.left, data);
        } else {
            node.right = this.insertRec(node.right, data);
        }
        return node;
    }
  
    // class that stores the value of count
     class count {
        constructor(){this.c = 0;}
    
    }
  
    // utility function to find kth largest no in 
    // a given tree
    function kthLargestUtil( node , k,  C)
    {
        // Base cases, the second condition is important to
        // avoid unnecessary recursive calls
        if (node == null || C.c >= k)
            return;
          
        // Follow reverse inorder traversal so that the
        // largest element is visited first
        this.kthLargestUtil(node.right, k, C); 
          
        // Increment count of visited nodes
        C.c++;
          
        // If c becomes k now, then this is the k'th largest 
        if (C.c == k) {
            document.write(k + "th largest element is " + 
                                                 node.data+"<br/>");
            return;
        }
          
        // Recur for left subtree
        this.kthLargestUtil(node.left, k, C); 
    }
  
    // Method to find the kth largest no in given BST
    function kthLargest(k)
    {
         c = new count(); // object of class count
        this.kthLargestUtil(this.root, k, c);
    }
  
    // Driver function
      
   
          
        /* Let us create following BST
              50
           /     \
          30      70
         /  \    /  \
       20   40  60   80 */
        insert(50);
        insert(30);
        insert(20);
        insert(40);
        insert(70);
        insert(60);
        insert(80);
  
        for (i = 1; i <= 7; i++) {
            kthLargest(i);
        }
  
// This code contributed by gauravrajput1 
</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 *