Skip to content

Commit 9123474

Browse files
adrianparasAdrian Paras
andauthored
Add Leftist Heap (#3789)
Co-authored-by: Adrian Paras <[email protected]>
1 parent 6a0035d commit 9123474

File tree

2 files changed

+146
-0
lines changed

2 files changed

+146
-0
lines changed
Lines changed: 118 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
package com.thealgorithms.datastructures.heaps;
2+
3+
import java.util.ArrayList;
4+
5+
/*
6+
* This is a leftist heap that follows the same operations as a
7+
* binary min heap, but may be unbalanced at times and follows a
8+
* leftist property, in which the left side is more heavy on the
9+
* right based on the null-path length (npl) values.
10+
*
11+
* Source: https://iq.opengenus.org/leftist-heap/
12+
*
13+
*/
14+
15+
public class LeftistHeap {
16+
private class Node {
17+
private int element, npl;
18+
private Node left, right;
19+
20+
// Node constructor setting the data element and left/right pointers to null
21+
private Node(int element) {
22+
this.element = element;
23+
left = right = null;
24+
npl = 0;
25+
}
26+
}
27+
28+
private Node root;
29+
30+
// Constructor
31+
public LeftistHeap() {
32+
root = null;
33+
}
34+
35+
// Checks if heap is empty
36+
public boolean isEmpty() {
37+
return root == null;
38+
}
39+
40+
// Resets structure to initial state
41+
public void clear() {
42+
// We will put head is null
43+
root = null;
44+
}
45+
46+
// Merge function that merges the contents of another leftist heap with the
47+
// current one
48+
public void merge(LeftistHeap h1) {
49+
// If the present function is rhs then we ignore the merge
50+
root = merge(root, h1.root);
51+
h1.root = null;
52+
}
53+
54+
// Function merge with two Nodes a and b
55+
public Node merge(Node a, Node b) {
56+
if (a == null)
57+
return b;
58+
59+
if (b == null)
60+
return a;
61+
62+
// Violates leftist property, so must do a swap
63+
if (a.element > b.element) {
64+
Node temp = a;
65+
a = b;
66+
b = temp;
67+
}
68+
69+
// Now we call the function merge to merge a and b
70+
a.right = merge(a.right, b);
71+
72+
// Violates leftist property so must swap here
73+
if (a.left == null) {
74+
a.left = a.right;
75+
a.right = null;
76+
} else {
77+
if (a.left.npl < a.right.npl) {
78+
Node temp = a.left;
79+
a.left = a.right;
80+
a.right = temp;
81+
}
82+
a.npl = a.right.npl + 1;
83+
}
84+
return a;
85+
}
86+
87+
// Function insert. Uses the merge function to add the data
88+
public void insert(int a) {
89+
root = merge(new Node(a), root);
90+
}
91+
92+
// Returns and removes the minimum element in the heap
93+
public int extract_min() {
94+
// If is empty return -1
95+
if (isEmpty())
96+
return -1;
97+
98+
int min = root.element;
99+
root = merge(root.left, root.right);
100+
return min;
101+
}
102+
103+
// Function returning a list of an in order traversal of the data structure
104+
public ArrayList<Integer> in_order() {
105+
ArrayList<Integer> lst = new ArrayList<>();
106+
in_order_aux(root, lst);
107+
return new ArrayList<>(lst);
108+
}
109+
110+
// Auxiliary function for in_order
111+
private void in_order_aux(Node n, ArrayList<Integer> lst) {
112+
if (n == null)
113+
return;
114+
in_order_aux(n.left, lst);
115+
lst.add(n.element);
116+
in_order_aux(n.right, lst);
117+
}
118+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.thealgorithms.datastructures.heaps;
2+
3+
import org.junit.jupiter.api.Assertions;
4+
import org.junit.jupiter.api.Test;
5+
6+
public class LeftistHeapTest {
7+
8+
@Test
9+
void testLeftistHeap() {
10+
LeftistHeap heap = new LeftistHeap();
11+
Assertions.assertTrue(heap.isEmpty());
12+
heap.insert(6);
13+
Assertions.assertTrue(!heap.isEmpty());
14+
heap.insert(2);
15+
heap.insert(3);
16+
heap.insert(1);
17+
heap.in_order();
18+
Assertions.assertTrue(heap.in_order().toString().equals("[6, 2, 3, 1]"));
19+
Assertions.assertTrue(heap.extract_min() == 1);
20+
Assertions.assertTrue(heap.in_order().toString().equals("[6, 2, 3]"));
21+
heap.insert(8);
22+
heap.insert(12);
23+
heap.insert(4);
24+
Assertions.assertTrue(heap.in_order().toString().equals("[8, 3, 12, 2, 6, 4]"));
25+
heap.clear();
26+
Assertions.assertTrue(heap.isEmpty());
27+
}
28+
}

0 commit comments

Comments
 (0)