1- package heaps ;
1+ package Heaps ;
22
33import java .util .ArrayList ;
44import java .util .List ;
55
66/**
77 * Heap tree where a node's key is higher than or equal to its parent's and lower than or equal
88 * to its children's.
9- * @author Nicolas Renard
109 *
10+ * @author Nicolas Renard
1111 */
1212public class MaxHeap implements Heap {
13-
13+
1414 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 <>();
1818 for (HeapElement heapElement : listElements ) {
1919 if (heapElement != null ) insertElement (heapElement );
2020 else System .out .println ("Null element. Not added to heap" );
2121 }
2222 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+ */
2631 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" );
2834 return maxHeap .get (elementIndex - 1 );
2935 }
30-
36+
3137 // Get the key of the element at a given index
3238 private double getElementKey (int elementIndex ) {
3339 return maxHeap .get (elementIndex - 1 ).getKey ();
3440 }
35-
41+
3642 // Swaps two elements in the heap
3743 private void swap (int index1 , int index2 ) {
3844 HeapElement temporaryElement = maxHeap .get (index1 - 1 );
3945 maxHeap .set (index1 - 1 , maxHeap .get (index2 - 1 ));
4046 maxHeap .set (index2 - 1 , temporaryElement );
4147 }
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
4450 private void toggleUp (int elementIndex ) {
4551 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 );
4955 }
5056 }
51-
57+
5258 // 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
5460 private void toggleDown (int elementIndex ) {
5561 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 ) {
5864 // 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 ;
6271 }
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+
6974 }
7075 }
7176
@@ -84,21 +89,23 @@ public void insertElement(HeapElement element) {
8489
8590 @ Override
8691 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" );
94100 // The last element in heap replaces the one to be deleted
95101 maxHeap .set (elementIndex - 1 , getElement (maxHeap .size ()));
96102 maxHeap .remove (maxHeap .size ());
97103 // 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 );
102109 }
103110
104111 @ Override
@@ -109,7 +116,4 @@ public HeapElement getElement() throws EmptyHeapException {
109116 throw new EmptyHeapException ("Heap is empty. Error retrieving element" );
110117 }
111118 }
112-
113- }
114-
115-
119+ }
0 commit comments