









































































Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Encontra documentos específicos para os exames da tua universidade
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
subárvore esquerda OU na subárvore direita. Pedro Ribeiro (DCC/FCUP). Árvores Binárias. 2018/2019. 15/81 ...
Tipologia: Slides
1 / 81
Esta página não é visível na pré-visualização
Não perca as partes importantes!










































































Pedro Ribeiro
DCC/FCUP
(baseado e/ou inspirado parcialmente nos slides de Lu´ıs Lopes e de Fernando Silva)
Os arrays e as listas s˜ao exemplos de estruturas de dados lineares. Cada elemento tem: um predecessor ´unico (excepto o primeiro elemento da lista); um sucessor ´unico (excepto o ´ultimo elemento da lista).
Existem outros tipos de estruturas? um grafo ´e uma estrutura de dados n˜ao-linear, pois cada um dos seus elementos, designados por n´os, podem ter mais de um predecessor ou mais de um sucessor.
As ´arvores s˜ao estruturas particularmente adequadas para representar informa¸c˜ao organizada em hierarquias: Alguns exemplos: I (^) a estrutura de direct´orios (ou pastas) de um sistema de ficheiros I (^) uma ´arvore geneal´ogica de uma fam´ılia I (^) uma ´arvore da vida
Muitas vezes n˜ao se incluem as ”setas” nos arcos (ou liga¸c˜oes) pois fica claro pelo desenho quais n´os descendem de quais:
Os arcos que ligam os n´os, chamam-se ramos Chama-se caminho `a sequˆencia de ramos entre dois n´os I (^) Exemplo: A-B-D ´e o caminho entre A e D O comprimento de um caminho ´e o n´umero de ramos nele contido; I (^) Exemplo: A-B-D tem comprimento 2 A profundidade de um n´o ´e o comprimento do caminho desde a ra´ız at´e esse n´o (a profundidade da raiz ´e zero); I (^) Exemplo: B tem profundidade 1, D tem profundidade 2 A altura de uma ´arvore ´e a profundidade m´axima de um n´o da ´arvore I (^) Exemplo: A ´arvore da figura tem altura 2
A aridade de uma ´arvore ´e o grau m´aximo de um n´o Uma ´arvore bin´aria ´e uma ´arvore de aridade 2, isto ´e, cada n´o possui no m´aximo dois filhos, designados por filho esquerdo e direito.
Vamos agora definir a ´arvore em si Do mesmo modo que uma lista ligada tem uma referˆencia para o primeiro n´o da lista, uma ´arvore deve ter uma referˆencia para... a ra´ız!
p u b l i c c l a s s BTree
Vamos criar alguns m´etodos para colocar na classe BTree
Vamos criar um m´etodo recursivo: I (^) Caso base: quando a ´arvore est´a vazia... tem 0 n´os! I (^) Caso recursivo: o no^ ´arvore ´e igual a 1 mais o no^ n´os da sub´arvore esquerda, mais o no^ n´os da sub´arvore direita F (^) Exemplo fig.: num n´os = 1 + num nos({B,D,E}) + num nos({C,F})
Vamos calcular a altura de uma ´arvore (profundidade m´axima de um n´o). Por exemplo, a ´arvore da figura tem altura 2 (a vermelho a profundidade de cada n´o).
Vamos criar um m´etodo recursivo muito parecido com o anterior: I (^) Caso recursivo: a altura de uma ´arvore ´e igual 1 mais o m´aximo entre as alturas das sub´arvores esquerda e direita F (^) Exemplo fig.: altura = 1 + max(altura({B,D,E}), altura({C,F})) Qual dever´a ser o caso base? Duas hip´oteses: I (^) Podemos parar numa folha: tem altura zero (0) I (^) Se pararmos numa ´arvore nula, a altura tem de ser... - F (^) Ex: altura ´arvore de 1 n´o = 1 + max(null, null) = 1 + max(-1, -1) = 0
Concretizando, com caso base da recurs˜ao do m´etodo auxiliar a ser a ´arvore nula (como no m´etodo do n´umero de n´os):
p u b l i c i n t depth () { r e t u r n depth(root ); } p r i v a t e i n t depth(BTNode
Concretizando, e recordando que para comparar objectos devem usar o .equals() e n˜ao o ==:
p u b l i c boolean contains (T value) { r e t u r n contains (root , value ); } p r i v a t e boolean contains (BTNode
Como escrever o conte´udo (os n´os) de uma ´arvore? Temos de passar por todos os n´os. Mas por qual ordem? Vamos distinguir entre duas ordens diferentes:
Pesquisa em Profundidade (DFS: depth-first-search): visitar todos os n´os da sub´arvore de um filho antes de visitar a sub´arvore do outro filho Pesquisa em Largura (BFS: breadth-first-search): visitar n´os por ordem crescente de profundidade
Concretizando em c´odigo o que foi dito no slide anterior:
p u b l i c v o i d printPreOrder () { System .out.print(" PreOrder :"); printPreOrder (root ); System .out. println (); } p r i v a t e v o i d printPreOrder (BTNode
Para a ´arvore anterior, iria ser escrito ”PreOrder: A B D E C F” Chamamos a esta ordem PreOrder, porque escrevemos a ra´ız antes das duas sub´arvores
Para al´em da PreOrder, podemos considerar tamb´em mais duas ordens em profundidade: I (^) InOrder: ra´ız escrita entre as duas sub´arvores I (^) PostOrder: ra´ız escrita depois das duas sub´arvores
Para a ´arvore da figura: I (^) PreOrder: A B D E C F I (^) InOrder: D B E A F C I (^) PostOrder: D E B F C A