Estruturas de Dados Árvores Prof. Rodrigo Rocha [email protected] http://www.bolinhabolinha.com Onde Estamos ? Ementa • • • • • • • • • Introdução à estrutura de dados. Alocação estática de memória memória. Alocação dinâmica de memória. Pilhas. Filas. Listas Listas. Algoritmos recursivos. Árvores. Grafos. 1 Árvores É uma estrutura de dados hierárquica • Exemplo chave de times em um campeonato árvore genealógica organograma funcional Componentes • • • • • • raiz (root) – nó superior aresta – linha que liga os nós folhas – nós filhos floresta – conjunto de árvores grau do nó - número de nós filhos grau da árvore - é o máximo entre os graus de seus nós Árvores Operações procura, predecessor, antecessor, mínimo, máximo, inserir e deletar Idealmente, temos – Árvore balanceada » Red black, avl, b tree – Altura: log n para n nós armazenamento – Muito g grande p para RAM – Parte em RAM, parte em méio magnético » Meio magnético + lento 2 Árvores binárias Estrutura de dados: árvore • cada nó tem no máximo duas sub árvores • Operações procura, predecessor, antecessor, mínimo, máximo, inserir e deletar Tempo é proporcional a altura da árvore Estrututa • • • • Campo chave Campo esquerdo Campo direito P = pai Se algum filho ou pai estiver ausente, o campo conterá nulo • O nó raiz é o único que contém o campo pai nulo Árvores binárias Implementando em um vetor • Array com 7 posições: • Armazenamento por nível: • posição do nó 1 2 3 i posição dos filhos do nó 2,3 4,5 6,7 (2i,2i+1) 3 Árvores binárias Implementando em uma estrutura • campo do valor • 2 ponteiros : para o filho da esquerda e direita • Estrutura (exemplo) typedef struct sttNo { tipo inf; struct sttNo *esq, *dir; } tNo; Árvores binárias Procedimento para imprimir todos os elementos de uma árvore binária INORDER-TREE-WALK(x) ( ) if x ≠ NIL then INORDER-TREE-WALK(left[x]) print key[x] INORDER-TREE-WALK(right[x]) 4 Árvore Binária de Pesquisa Árvore binária de pesquisa • nós são distribuídos de forma a facilitar a pesquisa • Para qualquer nó x elementos a esquerda são menores que o elemento pai elementos a direita são maiores que o elemento pai Árvores binárias Pesquisando TREE-SEARCH(x, k) if x = NIL or k = key[x] then return x if k < key[x] then return TREE-SEARCH(left[x], k) else return TREE-SEARCH(right[x], k) Chamada inicial: TREE-SEARCH(root[T ], k). Para procurar a chave 13 • 15-6-7-13 5 Árvores binárias Versão não recursiva do algoritmo ITERATIVE-TREE-SEARCH(x, k) 1 while x ≠ NIL and k ≠ key[x] 2 do if k < ke key[x] [ ] 3 then x ← left[x] 4 else x ← right[x] 5 return x Árvores binárias Máximo e mínimo valor TREE-MINIMUM(x) while left[x] = NIL do x ← left[x] return x TREE-MAXIMUM(x) while right[x] = NIL do x ← right[x] return x 6 Árvores binárias Sucessor e Predecessor • TREE-SUCCESSOR(x) if right[x] = NIL then return TREE-MINIMUM(right[x]) ( g [ ]) else y ← p[x] while y = NIL and x = right[y] do x ← y y ← p[y] return y • Atenção: Os algoritmos de sucessor, mínimo, máximo e predecessor não procuram pelos valores Árvores binárias Inserção • ache a folha que será inserido o nó • conecte o nó ao pai da folha Algortimo • TREE-INSERT (T, z) • y ← NIL x ← root [T] while x ≠ NIL do y ← x if key [z] < key[x] then x ← left[x] else x ← right[x] p[z] ← y if y = NIL then root [T] ← z else if key [z] < key [y] then left [y] ← z else right [y] ← z 7 Árvores binárias Remoção • nó sem filhos somente ajustamos o ponteiro do nó pai Árvores binárias Remoção • nó com um único filho mover o filho para a posição do nó pai 8 Árvores binárias Remoção • nó com dois filhos procuramos o sucessor (ou predecessor), que deverá ocupar o seu lugar l – nó mais a esquerda da sub-árvore da direita – como ele não tem filhos a esquerda, a sua sub-árvore a direita pode ser movida Árvores binárias Remoção Algoritmo TREE-DELETE (T, z) if left [z] = NIL .OR. right[z] = NIL then y ← z else y ← TREE-SUCCESSOR (z) if left [y] ≠ NIL then x ← left[y] else x ← right [y] if x ≠ NIL then p[x] ← p[y] if p[y] = NIL then root [T] ← x else if y = left [p[y]] th then l left ft [ [p[y]] [ ]] ← x else right [p[y]] ← x if y ≠ z then key [z] ← key [y] if y has other field, copy them, too return y 9 Árvores binárias Exercício • Para a árvore abaixo representada, responda as seguintes questões: • Número de elementos • Altura • Elemento Root (Pai) • Elementos folhas Árvores binárias - exercícios 1-) Desenhe a árvore de pesquisa binária, com os itens S,U,P,E,R,F,A,C,I,L. Onde cada nó tenha somente uma letra. 2 2-)) (12.1.1 (12 1 1 C Cormen): ) T Trace as á árvores d de pesquisa i bi binária ái d de altura 2,3,4,5 e 6 sobre o conjunto de chaves {1,4,5,10,16,17,21} 3-) Para a árvore binária abaixo, mostre os elementos que serão mostrados, utilizando o algoritmo INORDER-TREEWALK(x) 10 Exercícios 4-) Escreva o algortimo tree-predecessor. Exercícios 6-) Para a seguinte árvore binária, responda as questões a-)) Mostre os nós q que são p percorridos p para achar o nó com valor 9. O q que o algoritmo g retornou? b-) Mostre os nós que são percorridos para achar o nó com valor 8. O que o algoritmo retornou? c-) Ache o sucessor de 15. (Mostre os nós que o algoritmo percorreu) d-) Ache o sucessor de 6 . (Mostre os nós que o algoritmo percorreu) e-) Ache o sucessor de 4 . (Mostre os nós que o algoritmo percorreu) f-) Ache o predecessor de 6 . (Mostre os nós que o algoritmo percorreu) g-) Insira o valor 19. (Mostre os nós que o algoritmo percorreu) h-) Insira o valor 1. (Mostre os nós que o algoritmo percorreu) i-) Remova o nó com valor 13. Desenhe o novo layout da árvore j-) Remova o nó com valor 6. Desenhe o novo layout da árvore 11 Exercícios 7-) (12.2.1 Cormen) Suponha que você tenha os números de 1 a 1000 em uma árvore binária de busca, e quer localizar o número 363. Qual seqüência abaixo não pode ser a seqüência de nós examinados? a-) 2, 252, 401, 398, 330, 344, 397, 363. b-) 924, 220, 911, 244, 898, 258, 362, 363. c-) 925, 202, 911, 240, 912, 245, 363. d-) 2, 399, 387, 219, 266, 382, 381, 278, 363. e-) 935, 278, 347, 621, 299, 392, 358, 363. 8-) Escreva um algoritmo que traga a soma de todos os valores de uma árvore. Qual a sua complexidade? Justifique. Demo Animações na web • http://www.engin.umd.umich.edu/CIS/course.des/ cis350/treetool/ • http://www.cosc.canterbury.ac.nz/mukundan/dsal/ BSTNew.html • htt http://www.cosc.canterbury.ac.nz/mukundan/dsal/ // t b / k d /d l/ BST.html 12 Bibliografia Livro texto • TENENBAUM, Aaron M; SOUZA, Tereza Cristina Félix de. Estruturas de Dados usando C. 1ª ed. São Paulo: Makron , Books,1995. • PEREIRA, Silvio do Lago. Estrutura de Dados Fundamentais : conceitos e aplicações. 9ª ed. São Paulo: Érica, 2006. • VELOSO, Paulo A. S.. Estrutura de Dados. 1ª ed. São Paulo: Campus, 1983. Complementar • • • • VILLA, Marcos Vianna. Estrutura de Dados : conceitos e técnicas de implementação. 1ª ed. Rio de Janeiro: Campus, 1993. WIRTH, Niklaus. Algoritmos e estruturas de dados. 1ª ed. Rio de Janeiro: LTC, 1999 CORMEN, Thomas H.. ALGORITMOS : TEORIA E PRÁTICA. 2ª ed. Rio de Janeiro: CAMPUS, 2002 SCHILDT, Herbert. C Completo e Total. 3ª ed. São Paulo: Pearson Education, 2005 13