1
- package heaps ;
1
+ package Heaps ;
2
2
3
3
import java .util .ArrayList ;
4
4
import java .util .List ;
5
5
6
6
/**
7
7
* Heap tree where a node's key is higher than or equal to its parent's and lower than or equal
8
8
* to its children's.
9
- * @author Nicolas Renard
10
9
*
10
+ * @author Nicolas Renard
11
11
*/
12
12
public class MaxHeap implements Heap {
13
-
13
+
14
14
private final List <HeapElement > maxHeap ;
15
-
16
- public MaxHeap (List <HeapElement > listElements ) throws Exception {
17
- maxHeap = new ArrayList <HeapElement >();
15
+
16
+ public MaxHeap (List <HeapElement > listElements ) {
17
+ maxHeap = new ArrayList <>();
18
18
for (HeapElement heapElement : listElements ) {
19
19
if (heapElement != null ) insertElement (heapElement );
20
20
else System .out .println ("Null element. Not added to heap" );
21
21
}
22
22
if (maxHeap .size () == 0 ) System .out .println ("No element has been added, empty heap." );
23
- }
24
-
25
- // Get the element at a given index. The key for the list is equal to index value - 1
23
+ }
24
+
25
+ /**
26
+ * Get the element at a given index. The key for the list is equal to index value - 1
27
+ *
28
+ * @param elementIndex index
29
+ * @return heapElement
30
+ */
26
31
public HeapElement getElement (int elementIndex ) {
27
- if ((elementIndex <= 0 ) && (elementIndex > maxHeap .size ())) throw new IndexOutOfBoundsException ("Index out of heap range" );
32
+ if ((elementIndex <= 0 ) || (elementIndex > maxHeap .size ()))
33
+ throw new IndexOutOfBoundsException ("Index out of heap range" );
28
34
return maxHeap .get (elementIndex - 1 );
29
35
}
30
-
36
+
31
37
// Get the key of the element at a given index
32
38
private double getElementKey (int elementIndex ) {
33
39
return maxHeap .get (elementIndex - 1 ).getKey ();
34
40
}
35
-
41
+
36
42
// Swaps two elements in the heap
37
43
private void swap (int index1 , int index2 ) {
38
44
HeapElement temporaryElement = maxHeap .get (index1 - 1 );
39
45
maxHeap .set (index1 - 1 , maxHeap .get (index2 - 1 ));
40
46
maxHeap .set (index2 - 1 , temporaryElement );
41
47
}
42
-
43
- // Toggle an element up to its right place as long as its key is lower than its parent's
48
+
49
+ // Toggle an element up to its right place as long as its key is lower than its parent's
44
50
private void toggleUp (int elementIndex ) {
45
51
double key = maxHeap .get (elementIndex - 1 ).getKey ();
46
- while (getElementKey ((int ) Math .floor (elementIndex / 2 )) < key ) {
47
- swap (elementIndex , (int ) Math .floor (elementIndex / 2 ));
48
- elementIndex = (int ) Math .floor (elementIndex / 2 );
52
+ while (getElementKey ((int ) Math .floor (elementIndex / 2 )) < key ) {
53
+ swap (elementIndex , (int ) Math .floor (elementIndex / 2 ));
54
+ elementIndex = (int ) Math .floor (elementIndex / 2 );
49
55
}
50
56
}
51
-
57
+
52
58
// Toggle an element down to its right place as long as its key is higher
53
- // than any of its children's
59
+ // than any of its children's
54
60
private void toggleDown (int elementIndex ) {
55
61
double key = maxHeap .get (elementIndex - 1 ).getKey ();
56
- boolean wrongOrder = (key < getElementKey (elementIndex * 2 )) || (key < getElementKey (Math .min (elementIndex * 2 , maxHeap .size ())));
57
- while ((2 * elementIndex <= maxHeap .size ()) && wrongOrder ) {
62
+ boolean wrongOrder = (key < getElementKey (elementIndex * 2 )) || (key < getElementKey (Math .min (elementIndex * 2 , maxHeap .size ())));
63
+ while ((2 * elementIndex <= maxHeap .size ()) && wrongOrder ) {
58
64
// Check whether it shall swap the element with its left child or its right one if any.
59
- if ((2 *elementIndex < maxHeap .size ()) && (getElementKey (elementIndex *2 + 1 ) > getElementKey (elementIndex *2 ))) {
60
- swap (elementIndex , 2 *elementIndex + 1 );
61
- elementIndex = 2 *elementIndex + 1 ;
65
+ if ((2 * elementIndex < maxHeap .size ()) && (getElementKey (elementIndex * 2 + 1 ) > getElementKey (elementIndex * 2 ))) {
66
+ swap (elementIndex , 2 * elementIndex + 1 );
67
+ elementIndex = 2 * elementIndex + 1 ;
68
+ } else {
69
+ swap (elementIndex , 2 * elementIndex );
70
+ elementIndex = 2 * elementIndex ;
62
71
}
63
- else {
64
- swap (elementIndex , 2 *elementIndex );
65
- elementIndex = 2 *elementIndex ;
66
- }
67
- wrongOrder = (key < getElementKey (elementIndex *2 )) || (key < getElementKey (Math .min (elementIndex *2 , maxHeap .size ())));
68
-
72
+ wrongOrder = (key < getElementKey (elementIndex * 2 )) || (key < getElementKey (Math .min (elementIndex * 2 , maxHeap .size ())));
73
+
69
74
}
70
75
}
71
76
@@ -84,21 +89,23 @@ public void insertElement(HeapElement element) {
84
89
85
90
@ Override
86
91
public void deleteElement (int elementIndex ) {
87
- if (maxHeap .isEmpty ())
88
- try {
89
- throw new EmptyHeapException ("Attempt to delete an element from an empty heap" );
90
- } catch (EmptyHeapException e ) {
91
- e .printStackTrace ();
92
- }
93
- if ((elementIndex > maxHeap .size ()) && (elementIndex <= 0 )) throw new IndexOutOfBoundsException ("Index out of heap range" );
92
+ if (maxHeap .isEmpty ())
93
+ try {
94
+ throw new EmptyHeapException ("Attempt to delete an element from an empty heap" );
95
+ } catch (EmptyHeapException e ) {
96
+ e .printStackTrace ();
97
+ }
98
+ if ((elementIndex > maxHeap .size ()) || (elementIndex <= 0 ))
99
+ throw new IndexOutOfBoundsException ("Index out of heap range" );
94
100
// The last element in heap replaces the one to be deleted
95
101
maxHeap .set (elementIndex - 1 , getElement (maxHeap .size ()));
96
102
maxHeap .remove (maxHeap .size ());
97
103
// Shall the new element be moved up...
98
- if (getElementKey (elementIndex ) > getElementKey ((int ) Math .floor (elementIndex /2 ))) toggleUp (elementIndex );
99
- // ... or down ?
100
- else if (((2 *elementIndex <= maxHeap .size ()) && (getElementKey (elementIndex ) < getElementKey (elementIndex *2 ))) ||
101
- ((2 *elementIndex < maxHeap .size ()) && (getElementKey (elementIndex ) < getElementKey (elementIndex *2 )))) toggleDown (elementIndex );
104
+ if (getElementKey (elementIndex ) > getElementKey ((int ) Math .floor (elementIndex / 2 ))) toggleUp (elementIndex );
105
+ // ... or down ?
106
+ else if (((2 * elementIndex <= maxHeap .size ()) && (getElementKey (elementIndex ) < getElementKey (elementIndex * 2 ))) ||
107
+ ((2 * elementIndex < maxHeap .size ()) && (getElementKey (elementIndex ) < getElementKey (elementIndex * 2 ))))
108
+ toggleDown (elementIndex );
102
109
}
103
110
104
111
@ Override
@@ -109,7 +116,4 @@ public HeapElement getElement() throws EmptyHeapException {
109
116
throw new EmptyHeapException ("Heap is empty. Error retrieving element" );
110
117
}
111
118
}
112
-
113
- }
114
-
115
-
119
+ }
0 commit comments