Programa Java para implementar Leftist Heap

Un montón de izquierda es una cola de prioridad implementada con un montón binario. Cada Node tiene un sValue que está a la Distancia más cercana a los otros Nodes. Ahora escribiremos un programa java para realizar ciertas operaciones en un Heap de izquierda (Inorder Traversal) como insertar, eliminar, borrar y verificar si está vacío.

Un árbol izquierdista es un árbol binario con propiedades:

  1. Propiedad de almacenamiento dinámico mínimo normal: clave (i)> = clave (padre (i))
  2. Más pesado en el lado izquierdo: dist(right(i)) <= dist(left(i)). Aquí, dist(i) es el número de aristas en la ruta más corta desde el Node i hasta un Node hoja en una representación de árbol binario extendida (en esta representación, un hijo nulo se considera un Node externo u hoja). El camino más corto a un Node externo descendiente es a través del hijo derecho. Cada subárbol también es un árbol de izquierda y dist( i ) = 1 + dist( right( i ) ).

Ejemplo: El siguiente árbol de la izquierda se presenta con su distancia calculada para cada Node con el procedimiento mencionado anteriormente. El Node más a la derecha tiene un rango de 0 ya que el subárbol derecho de este Node es nulo y su padre tiene una distancia de 1 por dist( i ) = 1 + dist( right( i )). Se sigue lo mismo para cada Node y se calcula su valor s (o rango).

lt1

De la segunda propiedad anterior, podemos sacar dos conclusiones:

  1. El camino desde la raíz hasta la hoja más a la derecha es el camino más corto desde la raíz hasta la hoja.
  2. Si la ruta a la hoja más a la derecha tiene x Nodes, entonces el montón de la izquierda tiene al menos 2 x – 1 Node. Esto significa que la longitud de la ruta a la hoja más a la derecha es O (log n) para un montón a la izquierda con n Nodes.

Ejemplo:

LEFTIST HEAP
Functions to do
2. delete min
3. check empty
4. clear
2
Inorder Traversal: 53 52 54  
If you wish to continue type Y or y
y
Functions to do
2. delete min
3. check empty
4. clear
3
Empty status = false
Inorder Traversal: 53 52 54  
If you wish to continue type Y or y
y
Functions to do
2. delete min
3. check empty
4. clear
4
Inorder Traversal:  
If you wish to continue type Y or y

Acercarse: 

  • Primero tomaremos un Node de clase y crearemos su constructor y varios parámetros.
  • Luego crearemos una clase LeftHeap. En esta clase, crearemos varios métodos e intentaremos realizar sus operaciones.
  • Crearemos un constructor, donde mantendremos la raíz nula.
  • Crearemos un método isEmpty() para verificar si el Heap está vacío.
  • Crearemos un método clear(), para limpiar el montón.
  • Creamos un método para fusionar:
    • Aquí necesitamos tomar dos Nodes, y luego verificaríamos que ambos estén vacíos
    • Luego estableceríamos los valores a derecha o izquierda según nuestra conveniencia.
    • Esta función se utiliza para encontrar el elemento mínimo en el montón
  • Luego declaramos una función llamada del().
    • Esta función se usa para encontrar el número mínimo y luego lo eliminamos.
  • Luego declaramos la función principal y llamamos a la función y realizamos operaciones con la ayuda de un caso de cambio. Las operaciones realizadas son si verificar si está vacío o vaciar el montón o eliminar el elemento mínimo.

Implementación:

Java

// Java Program to Implement Leftist Heap
 
// Declare all libraries
import java.io.*;
import java.util.Scanner;
 
// Class Node
class Node {
   
    // elements, and sValue are the variables in class Node
    int element, sValue;
   
    // class has two parameters
    Node left, right;
 
    public Node(int element) { this(element, null, null); }
 
    // Function Node where we are using this keyword
    // Which will help us to avoid confusion if we are having
    // same elements
 
    public Node(int element, Node left, Node right)
    {
        this.element = element;
        this.left = left;
        this.right = right;
        this.sValue = 0;
    }
}
 
// Class Left heap
class LeftHeap {
   
    // Now parameter is created named head.
    private Node head;
 
    // Its constructor is created named left heap
    // Returns null
    public LeftHeap() { head = null; }
 
    // Now we will write function to check if the list is
    // empty
    public boolean isEmpty()
    {
        // If head is null returns true
        return head == null;
    }
   
    // Now we will write a function clear
    public void clear()
    {
        // We will put head is null
        head = null;
    }
 
    // Now let us create a function merge which will
    // help us merge
    public void merge(LeftHeap rhs)
    {
        // If the present function is rhs
        // then we return it
        if (this == rhs)
            return;
       
        // Here we call the function merge
        // And make rhs is equal to null
        head = merge(head, rhs.head);
        rhs.head = null;
    }
 
    // Function merge with two Nodes a and b
    public Node merge(Node a, Node b)
    {
        // If A is null
        // We return b
        if (a == null)
            return b;
       
        // If b is null
        // we return A
        if (b == null)
            return a;
 
        // If we put a element greater than b element
        if (a.element > b.element) {
           
            // We write the swap code
            Node temp = a;
            a = b;
            b = temp;
        }
 
        // Now we call the function merge to merge a and b
        a.right = merge(a.right, b);
       
        // If a is null we swap right with left and empty
        // right
        if (a.left == null) {
            a.left = a.right;
            a.right = null;
        }
       
        // else
        // if value in a is less than the svalue of right
        // If the condition is satisfied , we swap the left
        // with right
        else {
           
            if (a.left.sValue < a.right.sValue) {
                Node temp = a.left;
                a.left = a.right;
                a.right = temp;
            }
           
            // we store the value in a s Value of right
            // SValue
            a.sValue = a.right.sValue + 1;
        }
       
        // We now return the value of a
        return a;
    }
 
    // Function insert
    public void insert(int a)
    {
        // This root will help us insert a new variable
        head = merge(new Node(a), head);
    }
   
    // The below function will help us delete minimum
    // function present in the Heap
    public int del()
    {
        // If is empty return -1
        if (isEmpty())
            return -1;
 
        // Now we will store the element in variable and
        // Call the merge function to del that is converging
        // to head then  we return min
        int min = head.element;
       
        head = merge(head.left, head.right);
        return min;
    }
 
    // Function order
    // will print the starting and ending points in order.
    public void order()
    {
        order(head);
        System.out.println();
    }
 
    // Function order with Node r
    // If r not equal to r
    // It prints all the elements iterating from order left
    // to right
    private void order(Node r)
    {
        if (r != null) {
            order(r.left);
            System.out.print(r.element + " ");
            order(r.right);
        }
    }
}
 
// Class gfg
 
class GFG {
    public static void main(String[] args)
    {
 
        // Creating the scanner object
        Scanner sc = new Scanner(System.in);
        System.out.println("LEFTIST HEAP");
       
        // Creating object for class LeftHeap
        LeftHeap h = new LeftHeap();
       
        // Char ch
        char ch;
       
        // Now taking the loop
        do {
            // Now writing down all the functions
            System.out.println("Functions to do");
            System.out.println("1. insert");
            System.out.println("2. delete min");
            System.out.println("3. check empty");
            System.out.println("4. clear");
 
            // Scanning the choice to be used in switch
            int choice = sc.nextInt();
 
            // Using switch
            switch (choice) {
                 
                // Case 1
                // to insert the elements in the heap
                // call the insert func
            case 1:
                System.out.println("Enter integer element to insert");
                h.insert(sc.nextInt());
                break;
                 
                // Delete the minimum element in the func
                 
            case 2:
                h.del();
                 
                break;
                // To check the empty status of the heap
            case 3:
                System.out.println("Empty status = "
                                   + h.isEmpty());
                break;
                 
                // Cleaning the heap
            case 4:
                h.clear();
                break;
                 
            default:
                System.out.println("Wrong entry");
                break;
            }
           
            // Prints the inorder traversal
            // Calling the func
            System.out.print("\n Inorder Traversal: ");
            h.order();
           
            // Whether to continue or not
            System.out.println("\n If you wish to continue type Y or y");
           
            ch = sc.next().charAt(0);
        }
       
        // Closing of loop
        while (ch == 'Y' || ch == 'y');
    }
}

Producción:

  

Publicación traducida automáticamente

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