O documento apresenta 5 problemas sobre estruturas de dados e algoritmos. São eles: (1) inverter uma lista, (2) verificar se uma árvore binária é AVL, (3) transformar uma árvore binária de busca em lista ordenada, (4) concatenar duas árvores AVL, e (5) construir um heap a partir de dois outros heaps.
2. Índice
1. Escreva um algoritmo que inverta uma lista dada como entrada.
2. Escreva um algoritmo que verifique se uma árvore binária é AVL.
Obs1.: Cada elemento só pode ser visitado apenas uma vez;
Obs2.: Cada nó aponta apenas para seus filhos.
3. Escreva um algoritmo que transforme uma árvore binária de busca em uma lista
contendo as chaves da árvore em ordem crescente.
4. Escreva um algoritmo que concatene duas árvores AVL em uma árvore AVL
válida. O seu algoritmo deve executar em tempo O(h), onde h é a altura máxima
entre as duas árvores.
Definição: A concatenação intercala duas estruturas de dados onde todas as chaves de uma
são menores que todas as chaves da outra
5. Escreva um algoritmo que construa um heap que contém todos os elementos de
dois heaps de tamanho n. Os heaps dados são representados através de árvores
ligadas em vez de vetores (arrays), ou seja, cada nó tem ponteiro para os seus
dois filhos, pai e dois irmãos. O algoritmo deve executar em tempo O(log n) no
pior caso.
3. 1. Escreva um algoritmo que inverta uma lista dada como
entrada.
ALGORITMO INVERTER-LISTA
ENTRADA elista que é uma PILHA
SAÍDA slista que é uma PILHA
TOPO(slista) = NIL //PILHA DE SAÍDA VAZIA
ENQUANTO TOPO(elista) ≠ NIL //ENQUANTO PILHA NÃO ESTÁ VAZIA
FAÇA chave = REMOVER(elista) //REMOVE O TOPO DA PILHA DE ENTRADA
INSERIR(chave, slista) //INSERE NO TOPO DA PILHA DE SAÍDA
FIM ENQUANTO
FIM ALGORITMO
4. 1. Escreva um algoritmo que inverta uma lista dada como
entrada.
ALGORITMO INVERTER-LISTA
ENTRADA elista
SAÍDA slista
TOPO(pilha) = NIL //DEFINE UMA PILHA AUXILIAR VAZIA
x = CABEÇA(elista)
ENQUANTO x ≠ NIL
FAÇA INSERIR(CHAVE(x), pilha) //INSERE NO TOPO DE UMA PILHA AUXILIAR
x = PROXIMO(x)
FIM PARA
CABEÇA(slista) = TOPO(pilha)
//INSERE TODOS AS CHAVES DA PILHA AUXILIAR NA LISTA DE SAÍDA
FIM ALGORITMO
5. 2. Escreva um algoritmo que verifique se uma árvore binária é
AVL.
ALGORITMO EH-AVL
ENTRADA nó = raiz da árvore
SAÍDA (alt = altura da árvore, ehAVL = se árvore é AVL)
SE nó = NIL
ENTÃO (alt, ehAVL) = (0, TRUE) //CASO BASE
SENÃO (altdir, ehAVLdir) = EH-AVL(ESQUERDA(nó))
//RECURSÃO NA SUB-ÁRVORE ESQUERDA
(altesq, ehAVLesq) = EH-AVL(DIREITA(nó))
//RECURSÃO NA SUB-ÁRVORE DIREITA
alt = máximo(altdir, altesq) + 1
ehAVL = ehAVLdir E ehAVLesq E (absoluto(altdir - altesq) ≤ 1)
FIM SE
FIM ALGORITMO
6. 3. Escreva um algoritmo que transforme uma árvore binária de
busca em uma lista contendo as chaves da árvore em ordem
crescente.
ALGORITMO BUSCA-IN-ORDEM
ENTRADAS nó = raiz da árvore, lista vazia que é uma FILA
SAÍDA lista
SE nó ≠ NIL
ENTÃO lista = BUSCA-IN-ORDEM(ESQUERDA(nó), lista)
INSERIR(CHAVE(nó), lista) //INSERE A CHAVE NA (NO FINAL DA) FILA
lista = BUSCA-IN-ORDEM(DIREITA(nó), lista)
FIM SE
FIM ALGORITMO
7. 4. Escreva um algoritmo que concatene duas árvores AVL em
uma árvore AVL válida.
ALGORITMO CONCATENAR-AVL
ENTRADA arv1, arv2
SAÍDA arv
SE CHAVE(RAIZ(arv1)) > CHAVE(RAIZ(arv2)) ENTÃO troca(arv1,arv2) FIM SE
nó = RAIZ(arv2)
ENQUANTO ESQUERDA(nó) ≠ NIL FAÇA nó = ESQUERDA(nó) FIM ENQUANTO
REMOVER(nó, arv2)
RAIZ(arv) = nó
ESQUERDA(nó) = RAIZ(arv1)
DIREITA(nó) = RAIZ(arv2)
BALANCE(nó) = ALTURA(ESQUERDA(nó)) – ALTURA(DIREITA(nó))
ENQUANTO absoluto(BALANCE(nó)) ≤ 1 FAÇA ROTACIONAR(nó) FIM ENQUANTO
FIM ALGORITMO
8. 5. Escreva um algoritmo que construa um heap que contém
todos os elementos de dois heaps de tamanho n.
ALGORITMO UNIR-HEAPS
ENTRADA heap1, heap2
SAÍDA heap
nó = REMOVER(heap1)
RAIZ(heap) = nó
ESQUERDA(nó) = RAIZ(heap1), PAI(RAIZ(heap1)) = nó
DIREITA(nó) = RAIZ(heap2), PAI(RAIZ(heap2)) = nó
HEAPFY(nó)
x = RAIZ(heap1), y = RAIZ(heap2)
ENQUANTO x ≠ NIL E y ≠ NIL
FAÇA PROXIMO(x) = y, ANTERIOR(y) = x, x = DIREITA(x), y = ESQUERDA(y)
FIM ENQUANTO
FIM ALGORITMO