	procedure delete ( var pq : tree );
	var	temp : tree;
	begin
	if pq = nil then Error {*** deletion on an empty queue ***}
	else if pq^.right = nil then
		pq := pq^.left
	else	begin
		{*** promote left descendant up ***}
		pq^.k := pq^.left^.k;
		delete( pq^.left );
		{*** rearrange according to constraints ***}
		if pq^.left = nil then begin
			pq^.left := pq^.right;	pq^.right := nil  end;
		if pq^.right <> nil then
			if pq^.left^.k < pq^.right^.k then begin
				{*** descendants in wrong order ***}
				temp := pq^.right;
				pq^.right := pq^.left;
				pq^.left := temp
				end
		end
	end;
