INF1010 – Lista de Exercícios 2 Árvores 1. Construir algoritmo para dada uma árvore n-ária, transformá-la em uma árvore binária. 2. Qual a maior e menor quantidade de nós que podem existir em uma árvore binária completa de altura h ? 3. Represente a sequência abaixo na forma de árvores binárias de alturas mínima e máxima. s = { 3, 5, 9, 12, 14, 6, 7, 15 } 4. Escrever uma rotina em C para buscar a informação em um nó de uma árvore binária de busca, sendo dada a sua chave. Cuide para que a rotina seja eficiente. 5. Achar o maior elemento (campo numérico) de uma árvore binária dada. 6. Uma árvore binária é zig-zag quando é vazia ou quando não possui nós cheios. Sem usar recursividade, escreva, em C, uma função que recebe o endereço do nó raiz de uma árvore binária e verifica se ela é zig-zag. Se a árvore dada for zig-zag, a função deverá retornar sua altura; caso contrário, deverá retornar –1. Não utilize estruturas de dados auxiliares (pilhas, filas, etc...); apenas variáveis locais dos tipos ponteiro ou inteiro. 7. Uma árvore binária cuja altura é igual ao número de nós pode possuir nós cheios ? Justifique. 8. Desenhe uma árvore estritamente binária com 7 nós para a qual os percursos em pré-ordem e inordem produzem a mesma sequência de visitas. 9. Toda árvore binária cheia é completa. 10. Dados os percursos abaixo, reconstruir a árvore original: pré-ordem: 1, 2, 3, 6, 8, 4, 9, 10, 12, 11, 5, 7, I simétrica (in-ordem) : 6, 3, 8, 2, 4, 9, 12, 10, 11, 1, I, 7, 5 11. Escrever rotina em pseudo-código e em C para percorrer uma árvore binária qualquer, em nível, das folhas para a raiz. Indique a complexidade do algoritmo. 12. Responda Certo ou Errado, justificando. a. Qualquer que seja o número de chaves, é sempre possível construir com elas uma árvore binária completa. b. Qualquer que seja o número de chaves, é sempre possível construir com elas uma árvore binária cheia. c. Uma árvore binária que possui as folhas no último ou penúltimo níveis é completa. d. Dada uma árvore binária com mais de 3 nós, é possível que um percurso em pre-ordem e um percurso em ordem simétrica visitem os nós na mesma ordem ? 1 13. Utilizando uma árvore binária para representar uma expressão aritmética. a. Represente, em uma árvore binária, a seguinte expressão aritmética, respeitando a precedência usual dos operadores: 2 * (5 – 3) + (2 + 6) / 4. As folhas devem corresponder aos operandos e os nós interiores aos operadores. Não represente os parênteses. b. Defina, em C, a estrutura do nó da árvore binária utilizada para representar expressões. Assuma que os operandos são inteiros positivos e que apenas os operadores binários +, -, * e / são aceitos. A estrutura deve possuir o menor número possível de campos. c. Escreva em C uma função recursiva que recebe como parâmetro o endereço do nó raiz de uma árvore binária representando uma expressão e retorna como resultado o valor obtido na avaliação da expressão. Utilize a estrutura do nó definida no item c. d. Qual o percurso implementado pela função escrita no item anterior? O que realiza o procedimento de visita ? 14. Escreva, em C, uma função recursiva que permuta as subárvores esquerda e direita de todos os nós de uma árvore binária. A função deve receber como parâmetro o endereço do nó raiz da subárvore a ser processada. Explicite também a chamada externa. 15. Verificar se as árvores abaixo são binárias de busca a) b) 12 1 1 15 10 13 3 4 30 6 5 16 c) 2 15 10 20 5 17 13 11 14 22 21 2 AVL e Rubro Negra 16. A complexidade da busca em uma árvore binária AVL é O(log n)? e em uma ABB é O(log n)? 17. Considere a árvore AVL a seguir: 35 30 50 20 46 40 61 48 55 Realize, na árvore dada, a inserção das chaves 65, 70, 38, 44, 49 e 42, atualizando o fator de equilíbrio dos nós a cada inserção. Quando necessário, indique o nó desregulado e a rotação utilizada para regulá-lo. Redesenhe a árvore a cada passo. 18. Qual o número máximo e mínimo de nós em uma árvore AVL de altura h ? 19. Escrever algoritmo para verificar se a árvore passada como parâmetro é balanceada. Retorne a altura da árvore. 20. Inserir as chaves 9, 8, 7, 6, 1, 2, 3, 4, 5 em uma árvore AVL desenhando a árvore após cada inserção. Exclua as chaves 6 e 8, desenhando a árvore após cada inserção e exclusão. 21. Inserir as chaves 9, 8, 7, 6, 1, 2, 3, 4, 5 em uma árvore Rubro Negra desenhando a árvore após cada inserção. Exclua as chaves 6 e 8, desenhando a árvore após cada inserção e exclusão. 22. Sem utilizar estruturas auxiliares (pilhas, filas, ...) escreva em C uma função não recursiva para determinar a altura de uma árvore AVL, visitando o menor número de nós possível. Use a estrutura: typedef struct no t_no; struct no { int chave; int bal; /* fator de balanço: hdir - hesq */ t_no *esq, *dir; }; t_no *raiz; A função deve receber como parâmetro o endereço do nó raiz da árvore e retornar o valor da altura. 23. Apresente duas maneiras distintas de inserir as chaves 10, 20, 30, 40 e 50 em uma árvore AVL inicialmente vazia de modo que só ocorram exatamente 2 rotações duplas no mesmo sentido. Justifique sua resposta, realizando as inserções. 24. Considere uma árvore rubro-negra formada pela inserção de n nós com a operação Inserir. Argumente que se n > 1, a árvore terá pelo menos um nó VERMELHO. 3 Árvore B 25. Seja uma árvore B de ordem d = 3 e altura h = 3. Qual o número máximo de chaves na árvore? E o numero mínimo? Justifique. 26. Inserir em uma árvore B de ordem 2 vazia, as chaves { 10, 90, 170, 50, 80, 130, 100, 20, 30, 40, 70, 60 } na ordem. Remova sucessivamente da árvore B a menor chave do nó raiz até que a árvore fique vazia. Quando houver possibilidade de optar entre a chave sucessora ou predecessora imediata, opte sempre pela predecessora. Indique as ocorrências de redistribuição ou concatenação. 27. Considere a árvore B de ordem 2 abaixo: 109 55 5 45 61 80 77 125 81 100 121 122 190 133 135 140 189 200 210 220 230 Realize as seguintes operações, utilizando sempre a árvore resultante da operação anterior. Redesenhe a árvore a cada passo, indicando os nós que sofrem modificações, bem como a ocorrência de CISÃO, REDISTRIBUIÇÃO ou CONCATENAÇÃO: a) inserção de 150; b) remoção de 189; c) remoção de 80; d) inserção de 65; e) inserção de 66; f) remoção de 109. Use o mesmo critério para remoção dos nós. 28. Descreva as diferenças entre as árvores B e B+, ressaltando: Quantidade de chaves, localização dos dados, número de acessos e diferença entre nós internos e folhas. 29. Responda. a. A que condições deve satisfazer uma árvore B de ordem d para que a inserção de qualquer chave ocasione o aumento da altura da árvore ? b. A que condições deve satisfazer uma árvore B de ordem d para que a remoção de qualquer chave ocasione a redução da altura da árvore ? c. Por que a redistribuição deve ser tentada antes da concatenação durante a remoção de uma chave situada em um nó com ocupação mínima de uma árvore B ? d. Se uma chave não está situada em uma folha de uma árvore B, o que garante que sua sucessora imediata, se existir, estará obrigatoriamente localizada em uma folha ? e. Qual é o pior caso do algoritmo de inserção de uma chave em uma árvore B de ordem d ? Como deve ser a árvore ? 30. Para uma árvore B de ordem d > 0 e altura h > 0, calcule em função de d e h: a. O número mínimo de chaves que ela pode possuir (nMIN). b. O número máximo de chaves que ela pode possuir (nMAX). 4 Grafos 31. Desenhe um grafo com 10 vértices e 10 arestas com ciclos. Rotule os vértices e descreva os algoritmos a serem utilizados para realizar uma busca em profundidade e em amplitude. Inclua nos algoritmos uma visita aos nós e descreva que nós foram visitados por cada algoritmo. 32. Percorrer árvore em nível (sugestão: use uma fila como estrutura auxiliar). A B D Fila: A | B,C | D,E,F,G | H, I, J|K C E F H I G J K 33. Dado o grafo não direcionado e ponderado ilustrado abaixo, mostre como seria sua representação por matriz de adjacências e mostre também, passo a passo, o algoritmo de Kruskal para cálculo da árvore geradora mínima. Em cada passo do algoritmo mostre como ficaria a partição dinâmica dos nós utilizando a notação de conjuntos (ex.:{ {a,c}, {b,e,f}, {d}} ). 34. Usando o grafo abaixo descrito por uma lista de adjacências, faça: a) A representação do menor caminho (Dijkstra) partindo no vértice 1. b) A árvore geradora (spanning tree) de custo mínimo (Kruskal). 5