Árvores Rohit Gheyi Para entradas realmente grandes, o acesso linear O(n) de listas é proibi9vo Estrutura de dados não linear, cujas operações tem custos em geral O(log n) 1 2 Exemplo Como seria pesquisar a localização de um arquivo no windows explorer se não 9véssemos diretórios? Árvores Coleção de nós em hierarquia Vazia ou Raiz (root) e zero ou mais subárvores (T1, T2,..., Tk) cada uma conectada com o nó raiz Raiz da subárvore é um nó filho do nó raiz N nós, N 1 arestas 3 Exemplo Árvore Binária Raiz Uma árvore binária é uma estrutura de dados caracterizada por: Subárvores 3... 2 8... 9 1 Ou não tem elemento algum (árvore vazia) Ou tem um elemento dis9nto, denominado raiz, com dois ponteiros para duas estruturas diferentes, denominadas sub árvore esquerda e sub árvore direita 5 1
2 Subárvores Exemplo A árvore a seguir é binária? Jus9fique. 9 5 2 1 3 8 8 Definições Cada Nodo pode ter grau Nenhum, um ou dois filhos A profundidade de um nó é a distância deste nó até a raiz. Tamanho (length): número de arestas seguidas no caminho A maior profundidade de um nó, é a altura da árvore. Um conjunto de nós com a mesma profundidade é denominado nível da árvore. Qual a profundidade do nó? Qual a altura da árvore? Os nós e 9 estão no mesmo nível? e e 11? Qual o grau do nó? E de 9? E de? 9 10 Árvores Estritamente Binárias A árvore a seguir é estritamente binária? Jus9fique. Cada nó da árvore possui grau zero ou dois 9 1 3 2 11 12 2
Árvores Binárias Completa 1 A árvore a seguir é completa? 3 2 9 1 Se todas as folhas de uma árvore estritamente binária estiverem no mesmo nível d 13 1 2 Caracterize a árvore a seguir. Árvore binária? Estritamente binária? Completa? Altura? D B E A H I J K L M N O F C G Nó Implemente um Nó representando uma árvore. class Node { private Node left; private Node right; private Node parent; private long key; private Object value; Dados Satélites 15 1 Árvore Binária de Pesquisa Árvore binária de busca ou árvore binária de pesquisa é uma árvore binária onde todos os nós são valores todos nós à esquerda contêm uma subárvore com os valores menores ao nó raiz da subárvore todos os nós da subárvore à direita contêm somente valores maiores ao nó raiz. A principal u9lização de árvores binárias são as árvores binária de busca Exemplo 2 Subárvores Condição de pesquisa < < > > > 1 18 3
Intuição x Applet hhp://people.ksp.sk/%ekuko/bak/index.html hhp://www.cosc.canterbury.ac.nz/mukundan/ dsal/bstnew.html < x > x 19 20 1 Desenhe graficamente uma árvore binária de pesquisa que possua os elementos {1,, 5, 10, 1, 1, 21 e tenha altura:, 5 e. 2 Qual o sucessor dos nós 30 e 0? O sucessor de 30 é 0 O sucessor de 0 é 50 Fazemos alguma comparação? 21 22 3 Como pesquisar o nó com chave 0? < 50 Applet hhp://www.cosc.canterbury.ac.nz/mukundan/ dsal/bst.html > 30 23 2
Pesquisa Binária Para saber se uma chave está presente na tabela: 1. Compare a chave com o registro que está na posição do meio da tabela 2. Se não 9ver subárvores, retorne falso 3. Se a chave é menor então o procure se está na subárvore esquerda. Se a chave é maior então o procure se está na subárvore direita 25 Algoritmo Implemente uma busca binária itera9va. Faça a análise do pior caso. public Node pesquisa(int key, Node y) { Node t = y; while( t!= null ) { if (key < t.element) t = t.left; else if (key > t.element) t = t.right; else return t; return null; 2 Árvore Desbalanceada O que ocorre com a pesquisa em uma árvore binária se ela es9ver desbalanceada? 2 88 O(n) < x x > x 9 95 Solução: Outras árvores, como AVL, que veremos depois. 2 28 O que o algoritmo a seguir faz? Faça a análise do pior caso. XYZ (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 Inclusão A inserção começa com uma busca, procurando pelo valor Se não for encontrado, procuram se as subárvores da esquerda ou direita, como na busca Eventualmente, alcança se a folha, inserindose então o valor nesta posição Introduz se um nó novo na subárvore da esquerda se o valor novo for menor do que a raiz, Ou na subárvore da direita se o valor novo for maior do que a raiz 29 30 5
1 Insira os nodos,,, 5 5 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 31 2 O que o algoritmo a seguir faz? Faça a análise do pior caso. XYZ (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]] then left [p[y]] x else right [p[y]] x if y z then key [z] key [y] // se y tiver outro campo, copiar return y 32 Exclusão Pesquisa pelo nó n com a chave k e Quando o nó n possui: 1. Dois filhos que são folhas Remova o nó n 2. Um nó filho que é folha Junte o pai de n com o único filho de n 3. Sem filhos que são folhas Procure o sucessor (antecessor) de n Subs9tua n pelo sucessor Remova o sucessor recursivamente Caso 1: Exclusão Remova o nodo 0 da árvore binária Remova o nodo 100 da árvore binária 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]] then left [p[y]] x else right [p[y]] x if y z then key [z] key [y] return y 33 3 Caso 2: Exclusão Remova o nodo 90 da árvore binária 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]] then left [p[y]] x else right [p[y]] x if y z then key [z] key [y] return y Caso 3: Exclusão Remova o nodo 35 da árvore binária substitui sucessor Remove (caso 2) 35 3
Caminhamento Façam um algoritmo que caminhe na árvore a seguir e mostre os elementos. Mas qual ordem adotar para percorrer nós? Tipos de Caminhamento Pré ordem Visita raiz Percorre sub árvore esquerda em pré ordem Percorre sub árvore direita em pré ordem Em ordem (simétrica) Percorre sub árvore esquerda em ordem simétrica Visita raiz Percorre sub árvore direita em ordem simétrica Pós ordem Percorre sub árvore esquerda em pós ordem Percorre sub árvore direita em pós ordem Visita raiz 3 38 Applet hhp://www.cosc.canterbury.ac.nz/mukundan/ dsal/btree.html Caminhamento Em Ordem Analise a complexidade do algoritmo. emordem(node n) { if (n!= null) { emordem(n.left); visita(n.element); emordem(n.right); 39 0 Qual a saída do caminhamento em ordem da árvore binária a seguir? 2,, 5,, 11, 2, 5, e 9 Analise. Pré Ordem preordem(node n) { if (n!= null) { visita(n.element); preordem(n.left); preordem(n.right); 1 2
Qual a saída do caminhamento em pré ordem da árvore binária a seguir? 2,, 2,, 5, 11, 5, 9 e Analise. Pós Ordem posordem(node n) { if (n!= null) { posordem(n.left); posordem(n.right); visita(n.element); 3 1 Qual a saída do caminhamento em pós ordem da árvore binária a seguir? Implementações hhp://www.docjar.com/html/api/iiuf/u9l/ BinaryTree.java.html hhp://www.docjar.com/html/api/freenet/ support/binarytree.java.html 2, 5, 11,,,, 9, 5 e 2 5 POSCOMP 2009 POSCOMP 2009 8 8
Referências Capítulo 13 1a edição Capítulo 12 2a edição 9 9