E23: Árvores binárias de busca

Esta série de exercícios repete vários exercícios das séries E21 e E22 que se mostraram inesperadamente difíceis.

E23.1  Suponha dada uma lista encadeada sem cabeça com celulas do tipo celula.

struct cel {
   int conteudo; struct cel *prox;
};
typedef struct cel celula;

Suponha que lis é o endereço da primeira célula da lista. Queremos remover o primeiro nó da lista (suponha que a lista não é vazia). Qual dos dois fragmentos de código está correto? Explique detalhadamente. Faça figuras.

   celula **p;
   p = &lis;
   lis = lis->prox;
   free (*p);
   
   celula *p;
   p = lis;
   lis = lis->prox;
   free (p);
   

E23.2  O exercício E21.4 escreveu o código da varredura por níveis (ou busca em largura) de uma árvore binária.  O código usava uma fila de (ponteiros para) nós.  Escreva agora o código das funções de manipulação da fila.  Há cinco funções:  entranafila, saidafila, filavazia, criafila e liberafila.  Implemente a fila em um vetor com redimensionamento.  Imagine que as funções ficarão num módulo à parte.

E23.3  (Repetição de E21.5)  Escreva uma função que transforme um heap v[1..n] em uma árvore binária (quase completa, é claro).

E23.4  (Repetição de E22.1)  Escreva uma função que decida se uma dada árvore binária é ou não é de busca.