// ********************************************************* // Implementation file Heap.cpp for the ADT heap. // ********************************************************* #include "Heap.h" // header file for heap heapClass::heapClass() : Size(0) { } // end default constructor bool heapClass::HeapIsEmpty() const { return bool(Size == 0); } // end HeapIsEmpty void heapClass::HeapInsert(const heapItemType& NewItem, bool& Success) // Method: Inserts the new item after the last item in the // heap and trickles it up to its proper position. The // heap is full when it contains MAX_HEAP items. { Success = bool(Size < MAX_HEAP); if (Success) { // place the new item at the end of the heap Items[Size] = NewItem; // trickle new item up to its proper position int Place = Size; int Parent = (Place - 1)/2; while ( (Parent >= 0) && (Items[Place].Key() > Items[Parent].Key()) ) { // swap Items[Place] and Items[Parent] heapItemType Temp = Items[Parent]; Items[Parent] = Items[Place]; Items[Place] = Temp; Place = Parent; Parent = (Place -1 )/2; } // end while ++Size; } // end if } // end HeapInsert void heapClass::HeapDelete(heapItemType& RootItem, bool& Success) // Method: Swaps the last item in the heap with the root // and trickles it down to its proper position. { Success = bool(!HeapIsEmpty()); if (Success) { RootItem = Items[0]; Items[0] = Items[--Size]; RebuildHeap(0); } // end if } // end HeapDelete void heapClass::RebuildHeap(int Root) { // if the root is not a leaf and the root's search key // is less than the larger of the search keys in the // root's children int Child = 2 * Root + 1; // index of root's left // child, if any if ( Child < Size ) { // root is not a leaf, so it has a left child at Child int RightChild = Child + 1; // index of right child, // if any // if root has a right child, find larger child if ( (RightChild < Size) && (Items[RightChild].Key() > Items[Child].Key()) ) Child = RightChild; // index of larger child // if the root's value is smaller than the // value in the larger child, swap values if ( Items[Root].Key() < Items[Child].Key() ) { heapItemType Temp = Items[Root]; Items[Root] = Items[Child]; Items[Child] = Temp; // transform the new subtree into a heap RebuildHeap(Child); } // end if } // end if // if root is a leaf, do nothing } // end RebuildHeap // End of implementation file.