Diêgo João Costa Santiago
Í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.
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
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
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
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
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
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

Revisao1

  • 1.
  • 2.
    Índice 1. Escreva umalgoritmo 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 umalgoritmo 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 umalgoritmo 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 umalgoritmo 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 umalgoritmo 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 umalgoritmo 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 umalgoritmo 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