Você está na página 1de 37

Árvores binárias

Estruturas de Dados 1 – 2023.1


Prof. Pedro Nuno Moura

Material adaptado da Profa. Adriana Alvim


Árvores
 Até agora examinamos estruturas de dados que
podem ser chamadas de lineares,
 como vetores e listas
 Estas estruturas não são adequadas para armazenar
dados que devem ser dispostos de maneira
hierárquica

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores
 Por exemplo, os arquivos
(documentos) que criamos em
um computador são
armazenados dentro de uma
estrutura hierárquica de diretórios
(pastas)
 existe um diretório base dentro do
qual podemos armazenar diversos
subdiretórios e arquivos
 por sua vez dentro deles podemos
armazenar outros subdiretórios e
arquivos, e assim por diante,
recursivamente

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores
 A seguir, apresentaremos as árvores, estruturas de
dados adequadas para a representação de
hierarquias

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores
 A forma mais natural de definir uma estrutura de
árvores é a recursividade
 uma árvore é composta por um conjunto de nós
 existe um nó r, chamado raiz, que contém zero ou mais
subárvores, cujas raízes são ligadas diretamente a r

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores
 Nós com filhos são comumente chamados de nós
internos e nós que não têm filhos são chamados de
folhas, ou nós externos
 É tradicional desenhar as árvores com a raiz para
cima e folhas para baixo, ao contrário do que seria de
se esperar
 a figura abaixo exemplifica a estrutura de uma árvore

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores
 Observamos que, por adotarmos essa forma de
representação gráfica, não representamos
explicitamente a direção dos ponteiros,
 subentendendo que eles apontam sempre do pai para
os filhos

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores
 O número de filhos permitido por nó e as informações
armazenadas em cada nó diferenciam os diversos
tipos de árvores existentes
 Primeiro, examinaremos as árvores binárias, onde
cada nó tem, no máximo, dois filhos
 Estruturas recursivas serão usadas como base para o
estudo e a implementação das operações com
árvores

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
 Um exemplo de utilização de árvores binárias está na
avaliação de expressões
 Como trabalhamos com operadores que esperam um
ou dois operandos,
 os nós da árvore para representar uma expressão têm
no máximo dois filhos

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
 Exemplo
 árvores binárias representando expressões aritméticas
 nós folhas representam operandos
 nós internos operadores
 exemplo (3+6)*(4-1)+5

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
 Numa árvore binária,
 cada nó tem zero, um ou dois filhos
 Implementação dos métodos
 implementação recursiva, em geral
 Caso base: árvore binária vazia
 Caso geral: uma árvore binária é
 um nó raiz
 a subárvore da esquerda (sae) (que pode ser vazia)
 a subárvore da direita (sad) (que pode ser vazia)

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias - exemplo
 Os nós a, b, c, d, e, f formam uma árvore binária da
seguinte maneira

 a árvore é composta do nó a,
 da subárvore à esquerda formada por b e d,
 e da subárvore à direita formada por c, e e f
 o nó a representa a raiz da árvore
 e os nós b e c as raízes das subárvores
 finalmente, os nós d, e e f são folhas da árvore

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
 Notação textual
 a árvore vazia é representada por <>
 e árvores não vazias por <raiz sae sad>
 exemplo

<a <b <> <d <> <> > > <c <e <> <> > <f <> <> > > >

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
 Pela definição, uma subárvore de uma árvore binária
é sempre especificada como sendo a sae ou a sad de
uma árvore maior, e qualquer das duas subárvores
pode não existir
 assim,
 as duas árvores
 ao lado são distintas

 isto também pode ser visto pelas representações


textuais das duas árvores, que são, respectivamente
<a <b<><>> <> > e <a <> <b<><>> >

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
 Uma propriedade fundamental de todas as árvores é
que só existe um caminho da raiz para qualquer nó
 Com isto, podemos definir a altura de uma árvore
como sendo o
 comprimento do caminho mais longo da raiz até uma
das folhas

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
 Por exemplo
 a altura da árvore da esquerda é 2,
 e a altura das árvores da direita é 1
 Assim, a altura de uma árvore com um único nó raiz é
zero e,
 a altura de uma árvore vazia é negativa e vale -1

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Representação
 Árvore representada por primeiro nó que dá
acesso aos demais
 null: usado para representar ausência de subárvore
 Nó
 valor
 referência para subárvore esquerda (SAE)
 referência para subárvore direita (SAD)
 Conceitos de nó e árvore se misturam

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Operações Básicas
 Operações básicas
 definir / obter valor da raiz
 definir / obter subárvore à esquerda
 definir / obter subárvore à direita
 verificar se valor está na árvore
 mostrar conteúdo

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Implementação recursiva
 Recursão
 uma árvore binária é
 um nó raiz
 a subárvore da direita (sad) (que pode não existir)
 a subárvore da esquerda (sae) (que pode não existir)
 segundo essa definição, uma folha de uma árvore é um
nó com zero subárvores
 Em qualquer definição recursiva deve haver uma
condição de contorno, que permita a definição de
estruturas finitas, e, no nosso caso,
 a definição de uma árvore se encerra nas folhas,
identificadas como sendo nós com zero subárvores

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
public class Arvbin<T extends Comparable<T>>{

private T val; /* Valor armazenado na raiz. */

/* Referências para subárvores. */


private Arvbin<T> esq, dir;

/* Construtor de árvore sem subávores (dir = esq =


null). É fornecido apenas o valor da raiz. */
public Arvbin(T valor)
{
val = valor;
esq = null;
dir = null;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
/* Construtor de árvore com subávores. São fornecidos
o valor da raiz e as subárvores, que devem ter sido
construídas previamente.*/
public Arvbin(T valor, Arvbin<T> arvEsq, Arvbin<T> arvDir)
{
val = valor;
arvEsq = esq;
arvDir = dir;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
/* Retorna o valor armazenado na raiz. */
public T retornaVal()
{
return val;
}

/* Retorna a subárvore esquerda


(ou null se não houver). */
public Arvbin<T> retornaEsq()
{
return esq;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
/* Retorna a subárvore direita
(ou null se não houver). */
public Arvbin<T> retornaDir()
{
return dir;
}

/* Modifica o valor armazenado na raiz. */


public void defineVal(T valor)
{
val = valor;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
/* Redefine a subárvore esquerda,
apagando a antiga se houver. */
public void defineEsq(Arvbin<T> filho)
{
esq = filho;
}

/* Redefine a subárvore direita,


apagando a antiga se houver. */
public void defineDir(Arvbin<T> filho)
{
dir = filho;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
/* Imprime o conteúdo da árvore em pré-ordem */
public void mostra()
{
System.out.print("(" + val);
if (esq != null)
esq.mostra();
if (dir != null)
dir.mostra();
System.out.println(")");
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias
/* Verifica se um valor está na árvore. Se estiver, retorna um ponteiro para o
o nó que tem esse valor. Caso contrário, retorna null. */
public Arvbin<T> busca(T valor){

Arvbin<T> ret;

/* Se é igual ao valor armazenado, não precisa procurar mais. O nó é a raiz. */


if (valor == val)
{
return this;
}

/* Senão, começa procurando na subárvore esquerda. */


if (esq != null){
ret = esq.busca(valor);
if (ret != null)
return ret;
}

/* Se chega a esse ponto, estará na árvore se, e somente se,


estiver na subárvore direita */
if (dir != null)
return dir.busca(valor);
return null;
}

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Execução
(4(3(1)(2))(7(5)(6)))
(4(11(10(8)(9))(2))(7(5)(6)))
Imprimindo valor lido
(4(11(10(8)(9))(2))(7(5)(6)))
Press any key to continue . . .

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Percurso em árvores binárias
 A programação da função mostra seguiu a ordem
empregada na definição de árvore binária para decidir
a ordem em que as três ações seriam executadas
mostra raiz
mostra sae
mostra sad
 Entretanto, dependendo da aplicação em vista, esta
ordem poderia não ser a preferível, podendo ser
utilizada uma ordem diferente desta, por exemplo
mostra sae
mostra sad
mostra raiz

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Percurso em árvores binárias
 Muitas operações em árvores binárias envolvem o
percurso de todas as subárvores, executando alguma
ação de tratamento em cada nó, de forma que é
comum percorrer uma árvore em uma das seguintes
ordens

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Percurso em árvores binárias
 Ordens de percurso
 pré-ordem
 trata raiz, percorre sae, percorre sad
 exemplo: a b d c e f
 ordem simétrica
 percorre sae, trata raiz, percorre sad
 exemplo: b d a e c f
 pós-ordem
 percorre sae, percorre sad, trata raiz
 exemplo: d b e f c a

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias - altura
 Propriedade fundamental de árvores
 só existe um caminho da raiz para qualquer nó
 Altura de uma árvore
 comprimento do caminho mais longo da raiz até uma
das folhas
 a altura de uma árvore com um único nó raiz é zero
 a altura de uma árvore vazia é -1
 exemplo:
h=2

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias - altura
 Nível de um nó
 a raiz está no nível 0, seus filhos diretos no nível 1, ...
 o último nível da árvore é a altura da árvore

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias - altura
 Árvore cheia
 todos os seus nós internos têm duas subárvores
associadas
 número n de nós de uma árvore cheia de altura h
 n = 2h+1 - 1

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias - altura
 Árvore degenerada
 todos os seus nós internos têm uma única subárvore
associada
 número n de nós de uma árvore degenerada de altura h
 n=h+1

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Árvores binárias - altura
 Esforço computacional necessário para alcançar
qualquer nó da árvore
 proporcional à altura da árvore
 altura de uma árvore binária com n nós
 mínima: proporcional a log n (caso da árvore cheia)
 máxima: proporcional a n (caso da árvore degenerada)

 Preferencialmente, gostaríamos de ter complexidade


O(log n) para qualquer árvore binária
 Entretanto, isso só é verdadeiro para árvores
balanceadas (conceito que será abordado em ED2)
 Árvores degeneradas são um caso não-desejado
Estruturas de Dados I - Pedro Nuno Moura - UNIRIO
Árvores binárias - altura

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO


Referências
 Este material foi produzido baseado no material do
livro.
 W. Celes, R. Cerqueira e J.L. Rangel, Introdução a
Estruturas de Dados - com técnicas de programação
em C, Ed. Campus, 2004
 E no material do curso de ED1 da Profa. Adriana
Alvim.

Estruturas de Dados I - Pedro Nuno Moura - UNIRIO

Você também pode gostar