External btree::delete(1);

PROCEDURE DeleteLeftMost( VAR Employee : apointer;
                         VAR DeleteName : shorty );
{ delete the leftmost node in the tree and }
{  returns its value in DeleteName         }
BEGIN
 IF Employee^.Left <> NIL THEN
   DeleteLeftMost( Employee^.Left, DeleteName )
 ELSE BEGIN
   DeleteName := Employee^.details.Name;
   Employee := Employee^.right
 END
END{of DeleteLeftMost};


PROCEDURE DeleteRoot( VAR Employee : apointer );
{ deletes the root of the nonempty tree by replacing it  }
{ by its successor (or child) if it has only one, or     }
{ replacing its value by that of the leftmost descendant }
{ of the rightmost subtree.                              }
VAR
 DeletedName : shorty;
BEGIN
 IF Employee^.Left = NIL THEN
   Employee := Employee^.right
 ELSE IF Employee^.right = NIL THEN
   Employee := Employee^.Left
 ELSE BEGIN
   DeleteLeftMost( Employee^.right, DeletedName );
   Employee^.details.Name := DeletedName
 END
END{of DeleteRoot};


PROCEDURE Delete( VAR Employee : apointer;
                     key : shorty );
{ delete key from the tree--if it is not }
{ in the tree, do nothing                 }
BEGIN
 IF Employee = NIL THEN
   WRITELN ( bell, key, ' not in data file' )
 ELSE IF key = Employee^.details.Name THEN
   DeleteRoot( Employee )
 ELSE IF key < Employee^.details.Name THEN
   Delete(Employee^.Left, key )
 ELSE IF key > Employee^.details.Name THEN
   Delete( Employee^.right, key )
END;

.