int OrderedSearchTree<Etype>::Remove( const Etype & X, BinaryNode<Etype> * & T ) { BinaryNode<Etype> *Tmp = NULL; if( T == NULL ) return 0; else if( X < T->Element ) // Go left return Remove( X, T->Left ) ? T->Size-- : 0; else if( T->Element < X ) // Go right return Remove( X, T->Right ) ? T->Size-- : 0; else if( T->Left != NULL && T->Right != NULL ) // Two children { Tmp = (BinaryNode<Etype> *) FindMin( T->Right ); T->Element = Tmp->Element; T->Size--; return RemoveMin( T->Right ); // Remove minimum } // One or zero children Tmp = T; T = ( T->Left != NULL ) ? T->Left : T->Right; delete Tmp; return 1; }
int main() { MinHeap* heap = NewMinHeap(); for (int i = 10; i > 0; --i) { Push(heap, i); printf("Min Value: %d\n", MinValue(heap)); } while (heap->size > 0) { int min = RemoveMin(heap); printf("Removed min value: %d. Size is now %d.", min, heap->size); } }
int OrderedSearchTree<Etype>::RemoveMin( BinaryNode<Etype> * & T ) { if( T == NULL ) return 0; else if( T->Left != NULL ) return RemoveMin( T->Left ) ? T->Size-- : 0; BinaryNode<Etype> *Tmp = T; T = T->Right; delete Tmp; return 1; }