ESTRUTURAS DE DADOS E ALGORITMOS 1 ÁRVORE BINÁRIA Adalberto Cajueiro Departamento de Sistemas e Computação Universidade Federal de Campina Grande
ÁRVORE (EXEMPLO) Como seria pesquisar a localização de um arquivo no sistema de arquivos se não tivéssemos diretórios? Para entradas realmente grandes, o acesso linear é proibitivo! Precisamos de alguma estrutura nao-linear de acesso mais eficiente. 2
ÁRVORE Estrutura não-linear com tempo de acesso em média O(log n). Coleção de nós em hierarquia Vazia ou Raiz (root) e zero ou mais subárvores Raiz da subárvore é um nó filho do nó raiz A raiz de uma árvore é unica! Não possui ciclos N nós, N-1 arestas 3
ÁRVORE (ILUSTRACAO) raiz root raiz... 4
ÁRVORE (ILUSTRACAO) raiz... folha (leaf) 5
ÁRVORE raiz Nível 0 6 Nível 1... Nível k Nível k + 1 Altura = k+1
ÁRVORE Uma árvore binária é uma estrutura de dados caracterizada por: Ou não tem elemento algum (árvore vazia) Ou tem um elemento distinto, denominado raiz, com duas referencias para duas estruturas diferentes, denominadas sub-árvore (filho) esquerda e sub-árvore (filho) direita Cada nó pode ter grau: 0, 1 ou 2 7
ÁRVORE A ligação entre os nós são vistas como apontadores direcionados do pai para os filhos. Por questoes de implementação apontadores podem existir também referêcias dos filhos para o pai O numero de filhos por nó diferenciam os vários tipos de arvores existentes. Cada nó da árvore encontra-se em determinado nível. A raiz encontra-se no nível zero. Propriedade fundamental: só existe um caminho da raiz para um outro nó da árvore. Altura de uma árvore: comprimento do caminho mais longo da raiz até as folhas 8
ÁRVORE (APLICABILIDADE) Representacao de expressoes aritméticas 5*3 + 4/2 + * / 5 3 4 2 9
EXERCÍCIO Qual a profundidade do nó 6? Qual a altura da árvore? Os nós 6 e 9 estão no mesmo nível? e 7 e 11? Qual o grau do nó 7? E de 9? E de 4? 10
ÁRVORES ESTRITAMENTE BINÁRIAS Cada nó possui grau 0 ou 2 Quantos nós terá uma AEB com n folhas? 7 4 6 Desenhe diversas arvores e tente deduzir. 9 1 3 2 11
EXERCÍCIO A árvore a seguir é estritamente binária? Justifique. 12
ÁRVORE BINÁRIA COMPLETA Todos os níveis são completos (folhas estão no mesmo nível) Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos em cada nível? Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos no total? nível 0 nos:1 total:1 nível 1 nos:2 total:3 nível 2 nos:4 total:7 nível 3 nos:8 total:15 13
ÁRVORE BINÁRIA COMPLETA Todos os níveis são completos (folhas estão no mesmo nível) Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos em cada nível? Qual a relacao que existe entre a altura de uma árvore binária completa e o número de elementos no total? nível 0 nos:1 total:1 nível 1 nos:2 total:3 nível 2 nos:4 total:7 nível 3 nos:8 total:15 h 2 h 2 h+1-1 14
ÁRVORES BINÁRIAS (PERCURSOS) Formas de percurso em árvore binárias: Pré-ordem (RAIZ, ESQ, DIR) Visita raiz Percorre sub-árvore esquerda em pré-ordem Percorre sub-árvore direita em pré-ordem Em-ordem (simétrica) (ESQ, RAIZ, DIR) Percorre sub-árvore esquerda em ordem simétrica Visita raiz Percorre sub-árvore direita em ordem simétrica Pós-ordem (ESQ, DIR, RAIZ) Percorre sub-árvore esquerda em pós-ordem Percorre sub-árvore direita em pós-ordem Visita raiz Applet: http://www.cosc.canterbury.ac.nz/mukundan/dsal/btree.html 15
ARVORES BINÁRIAS Impressão em pré-ordem (R,E,D): 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 16
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 17
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4 4 12 2 6 10 14 1 3 5 7 9 11 13 15 18
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2 4 12 2 6 10 14 1 3 5 7 9 11 13 15 19
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1 4 12 2 6 10 14 1 3 5 7 9 11 13 15 20
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1,3 4 12 2 6 10 14 1 3 5 7 9 11 13 15 21
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1,3,6 4 12 2 6 10 14 1 3 5 7 9 11 13 15 22
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1,3,6,5 4 12 2 6 10 14 1 3 5 7 9 11 13 15 23
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1,3,6,5,7 4 12 2 6 10 14 1 3 5 7 9 11 13 15 24
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1,3,6,5,7, 12 4 12 2 6 10 14 1 3 5 7 9 11 13 15 25
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1,3,6,5,7, 12,10 4 12 2 6 10 14 1 3 5 7 9 11 13 15 26
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1,3,6,5,7, 12,10,9 4 12 2 6 10 14 1 3 5 7 9 11 13 15 27
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1,3,6,5,7, 12,10,9,11 4 12 2 6 10 14 1 3 5 7 9 11 13 15 28
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1,3,6,5,7, 12,10,9,11,14 4 12 2 6 10 14 1 3 5 7 9 11 13 15 29
ARVORES BINÁRIAS Impressão em pré-ordem: 8 8,4,2,1,3,6,5,7, 12,10,9,11,14,13 4 12 2 6 10 14 1 3 5 7 9 11 13 15 30
EXERCÍCIO Qual a saída do caminhamento em pré ordem da árvore binária a seguir? 31
ARVORES BINÁRIAS Impressão em ordem simétrica (E,R,D): 8 1,2,3,4,5,6,7,8,9 10,11,12,13,14,15 4 12 2 6 10 14 1 3 5 7 9 11 13 15 32
EXERCÍCIO Qual a saída do percurso em ordem da árvore binária a seguir? 33
ARVORES BINÁRIAS Impressão em pós-ordem (E,D,R): 8 1,3,2,5,7,6,4,9,11,10 13,15,14,12,8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 34
EXERCÍCIO Qual a saída do caminhamento em pós ordem da árvore binária a seguir? 35
ÁRVORE BINÁRIA (IMPLEMENTAÇÃO) De que é composta uma árvore binária? Como implementar uma árvore binária? 36
ÁRVORE BINÁRIA (IMPLEMENTAÇÃO) De que é composta uma árvore binária? Como implementar uma árvore binária? public class BTNode<T> { protected T data; protected BTNode<T> left; protected BTNode<T> right; protected BTNode<T> parent; public boolean isempty(){ return this.data == null; } } //getters, setters, equals, tostring 37
ÁRVORE BINÁRIA (IMPLEMENTAÇÃO) De que é composta uma árvore binária? Como implementar uma árvore binária? public interface BT<T> { public BTNode<T> getroot(); public boolean isempty(); public int height(); public BTNode<T> search(t elem); public void insert(t value); public void remove(t key); public T[] preorder(); public T[] order(); public T[] postorder(); public int size(); } 38
ÁRVORE BINÁRIA (IMPLEMENTAÇÃO) Como representar uma árvore vazia? null data = null null null O construtor default de BTNode já gera uma árvore vazia? 39
ÁRVORE BINÁRIA (IMPLEMENTAÇÃO) Como representar uma árvore vazia? null O nó sentilena de uma árvore binária não contem dados data = null = NIL null null O construtor default de BTNode já gera uma árvore vazia? 40
ÁRVORE BINÁRIA (IMPLEMENTAÇÃO) Como representar uma árvore contendo apenas um nó? null null data folha data folha null null NIL NIL null null null null 41
ÁRVORE BINÁRIA DE BUSCA Árvore binária de busca ou árvore binária de pesquisa é uma árvore binária onde todos os nós armazenam dados comparáveis todos nós da sub-árvore à esquerda contêm valores menores do que o nó raiz todos os nós da subárvore à direita contêm valores maiores do que o nó raiz. x < x > x A principal utilização de árvores binárias são as árvores binária de busca 42
EXEMPLO 2 Subárvores < > < > > O quanto isso reduz o espaço da busca a cada passo? 43
ÁRVORE BINÁRIA DE BUSCA (IMPLEMENTAÇÃO) Uma BST é uma BT? Como implementar isso em Java? 44
ÁRVORE BINÁRIA DE BUSCA (IMPLEMENTAÇÃO) Uma BST é uma BT? Como implementar isso em Java? public class BSTNode<T extends Comparable<T>> extends BTNode<T> { } 45
ÁRVORE BINÁRIA DE BUSCA (IMPLEMENTAÇÃO) Uma BST é uma BT? Como implementar isso em Java? public interface BST<T extends Comparable<T>> extends BT<T> { public BTNode<T> maximum(); public BTNode<T> minimum(); public BTNode<T> successor(btnode<t> node); public BTNode<T> predecessor(btnode<t> node); } 46
PESQUISA BINÁRIA Como saber se um dado/valor/chave está na árvore? Se o nó é vazio (caso base) Árvore vazia não contém dado algum Se o nó é não-vazio Verifica se o dado do nó é igual à chave dada Se nao for Se a chave dada for menor que o dado do nó, pesquisa na sub-árvore a esquerda Senao pesquise na sub-árvore a direita 47
PESQUISA BINÁRIA (IMPLEMENTACAO) Qual o custo da busca? 48
ÁRVORE DESBALANCEADA O que ocorre com a pesquisa binária se a árvore estiver desbalanceada? 42 < x x 88 > x 94 95 49
ÁRVORE DESBALANCEADA O que ocorre com a pesquisa binária se a árvore estiver desbalanceada? 42 < x x 88 O(n) > x 94 95 Solução: Outras árvores, como AVL, que veremos depois. 50
MINIMUM Como buscar o elemento mínimo de uma BST? Descer pela esquerda até que um NIL seja encontrado 51
MAXIMUM Como buscar o elemento máximo de uma BST? Descer pela direita até que um NIL seja encontrado 52
SUCESSOR Como buscar o sucessor de um elemento em uma BST? Sucessor é a menor das chaves maiores (menor descendente a direita) 53
SUCESSOR Como buscar o sucessor de um elemento em uma BST? Sucessor é a menor das chaves maiores (primeiro ascendente maior) 54
PREDECESSOR Como buscar o predecessor de um elemento em uma BST? Predecessor é a maior das chaves menores (maior descendente a esquerda). Simétrico ao sucessor Tree-Predecessor(x) if left[x]!= NIL then return Tree-Maximum(left[x]) y = p[x] while y!= NIL and x = left[y] do x = y y = p[y] return y 55
PREDECESSOR Como buscar o predecessor de um elemento em uma BST? Predecessor é a maior das chaves menores (primeiro ascendente maior). Simétrico ao sucessor Tree-Predecessor(x) if left[x]!= NIL then return Tree-Maximum(left[x]) y = p[x] while y!= NIL and x = left[y] do x = y y = p[y] return y 56
ÁRVORE BINÁRIA (INSERÇÃO) Acontece pela raiz (admitir elementos diferentes) Processar apenas chaves diferentes da raiz Se a chave for menor, insere no filho a esquerda Se a chave for maior insere no filho a direita Insercao sempre acontece em uma nova folha 57
EXERCÍCIO 1 Insira as chaves 46, 47, 44, 45 58
EXERCÍCIO 1 Insira as chaves 46, 47, 44, 45 46 59
EXERCÍCIO 1 Insira as chaves 46, 47, 44, 45 46 47 60
EXERCÍCIO 1 Insira as chaves 46, 47, 44, 45 46 44 47 61
EXERCÍCIO 1 Insira as chaves 46, 47, 44, 45 46 44 47 45 62
ÁRVORE BINÁRIA (INSERCAO) Recursivo Tree-insert(BSTNode node, T element){ if(node=nil){ node.data = element node.left = NIL node.right = NIL }else{ if(element< node.data){ Tree-insert(node.left, element) }else if (element > node.data){ Tree-insert (node.right, element) } } } Qual o custo? 63
ARVORES BINÁRIAS (REMOCAO) Remocoes em arvores binarias: Se o nó y (a ser removido) for uma folha entao remova-o. Se o nó y tem apenas um filho, então ligamos o pai de y ao filho de y Se tem dois filhos então traz o sucessor de y para o lugar dele e remove o sucessor 12 12 10 14 10 15 9 11 13 15 9 11 13 64
ARVORES BINÁRIAS (REMOCAO) Outras abordagens trabalham da seguinte forma: Se for folha remove Senao sobe o menor descendente a direita (sucessor) Se nao existir menor descendente a direita então sobe o maior descendente a esquerda (predecessor) Remove recursivamente o nó movido. 65
ARVORES BINÁRIAS (REMOCAO) remover 20 66
ARVORES BINÁRIAS (REMOCAO) 67
ARVORES BINÁRIAS (REMOCAO) remover 30 68
ARVORES BINÁRIAS (REMOCAO) remover 30 40 69
ARVORES BINÁRIAS (REMOCAO) remover 50 40 70
ARVORES BINÁRIAS (REMOCAO) 90 remover 90 40 71
ARVORES BINÁRIAS (REMOCAO) 90 40 100 72
Tree-remove(value) { BSTNode node = search(value) if(node!= NIL){ if(node is leaf){ ÁRVORE BINÁRIA (REMOCAO) } } node = NIL }else if (node has one child){ if node!= root if(node is left child){ if(node.left!= NIL) node.left is left child of node.parent else node.right is left child of node.parent else //node is right child if(node.left!= NIL) node.left is right child of parent else node.right is right child of parent else root = not NIL child of root }else{ BSTNode sucessor = sucessor(node); node.data = sucessor.data; Tree-remove(sucessor); } 73
ÁRVORE BINÁRIA (PERCURSO) Algoritmo do percurso em pre-ordem 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 Como seria o algoritmo? 74
ÁRVORE BINÁRIA (PERCURSO) Algoritmo do percurso em pre-ordem preorder(bstnode node){ if(node!= NIL){ visit(node); preorder(node.left); preorder(node.right); } } visit(bstnode){ print(node.key); } Poderia fazer qualquer outro processamento 75
ÁRVORE BINÁRIA (PERCURSO) Algoritmo do percurso em ordem 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 Como seria o algoritmo? 76
ÁRVORE BINÁRIA (PERCURSO) Algoritmo do percurso em ordem order(bstnode node){ if(node!= NIL){ order(node.left); visit(node); order(node.right); } } 77
ÁRVORE BINÁRIA (PERCURSO) Algoritmo do percurso em pós-ordem 8 4 12 2 6 10 14 1 3 5 7 9 11 13 15 Como seria o algoritmo? 78
ÁRVORE BINÁRIA (PERCURSO) Algoritmo do percurso em pós-ordem postorder(bstnode node){ if(node!= NIL){ postorder(node.left); postorder(node.right); visit(node); } } 79
ÁRVORE BINÁRIA Como seria para calcular recursivamente o tamanho (quantidade de elementos) de uma árvore binária 1 size(root) = 1 + size(left) + size(right) size size 80
ÁRVORE BINÁRIA Como seria para calcular recursivamente o tamanho (quantidade de elementos) de uma árvore binária int size(){ return size(root) } int size(bstnode node){ if(node.isempty) return 0 else return 1 + size(node.left) + size(node.right) } 81
POSCOMP 2009 Nao necessariamente balanceada! 82
POSCOMP 2009 83
POSCOMP 2009 84
POSCOMP 2009 85
REFERÊNCIAS Capítulo 13 86