Introdução a Árvores e Árvores
Binárias
Prof. Kariston Pereira
Adaptado de Material gentilmente fornecido pelo
Prof. Rui Tramontin (DCC/UDESC)
Tópicos Abordados

Introdução

Definição de Árvore

Árvores Binárias
UDESC – Prof. Kariston Pereira
2
Introdução

Necessidade de se representar
estruturas de dados hierárquicas.




Estrutura de diretórios
Taxonomias
Organogramas
Sintaxe de expressões
Tais estruturas são
representadas por
Árvores.
UDESC – Prof. Kariston Pereira
3
Introdução

Exemplos: expressão, taxonomia
a + (b * c) / d
Animal
/
Mamífero
+
a
Réptil
d
Primata
*
b
Ave
c
Homem
Cetáceo
Gorila
...
...
Baleia
UDESC – Prof. Kariston Pereira
4
Introdução

Exemplo: sistema de arquivos
UDESC – Prof. Kariston Pereira
5
Tópicos Abordados

Introdução

Definição de Árvore

Árvores Binárias
UDESC – Prof. Kariston Pereira
6
Definição de Árvore

Definição recursiva:



Conjunto de nós.
Existe um nó r denominado raiz, com zero ou mais subárvores, cujas raízes são ligadas diretamente a r.
Os nós raízes das sub árvores são ditos filhos de r.
nó raiz
...
UDESC – Prof. Kariston Pereira
sub-árvores
7
Conceitos Básicos

Grau de saída: número de filhos (sub-árvores) de um nó.

Nó folha: grau de saída = 0.

Nó interno: grau de saída > 0.

Caminho: sequência de nós que tenham relação pai-filho.

Nível de um nó: número de nós no caminho até r.

Altura de árvore: maior nível dentre seus nós.
UDESC – Prof. Kariston Pereira
8
Conceitos Básicos
Grau = 3
A
Nós
internos
B
D
C
Nível = 2
Altura = 3
E
F
I
J
G
H
K
Nós
folhas
UDESC – Prof. Kariston Pereira
9
Tópicos Abordados

Introdução

Definição de Árvore

Árvores Binárias
UDESC – Prof. Kariston Pereira
10
Árvores Binárias


Definição: é a árvore onde todos os seus nós têm
grau <= 2.
Portanto, cada nó pode ter um filho (sub-árvore) à
esquerda e um filho à direira.
UDESC – Prof. Kariston Pereira
11
Tipos de Árvores Binárias




Estritamente Binária: todo nó
interno tem exatamente 2 filhos.
Completa (Cheia): estritamente
binária, e todas as folhas estão no
mesmo nível.
Balanceada: para todo nó, a
diferença de altura de suas subárvores é de no máximo 1.
Degenerada: todos os nós têm
no máximo 1 filho (lista
encadeada).
UDESC – Prof. Kariston Pereira
12
Tipos de Árvores Binárias:
N
Quase Completa

Uma Árvore Binária de
profundidade d será uma
Árvore Binária Quase
Completa se:



N
Cada follha na árvore estiver no
nível d ou no nível d – 1 (até o nível
d – 1 ela é completa);
S
Para cada nó nd na árvore com um
descendente direito no nível d,
todos os descendentes esquerdos
de nd que forem folhas devem
estar ao menos no nível d;
Uma árvore binária quase completa
tem todos os seus níveis completos
exceto o último, o qual pode ter
apenas os elementos mais à
esquerda.
UDESC – Prof. Kariston Pereira
13
Tipos de Árvores Binárias:
N
Quase Completa


Os nós de uma árvore binária
quase completa podem ser
numerados, de modo que seja
atribuído o número 1 à raiz, um
filho esquerdo receba a
atribuição de um número
equivalente ao dobro do número
atribuído ao seu pai, e um filho
direito receba a atribuição de
um número equivalente a um
mais que o dobro do número
atribuído a seu pai.
N
S
Os nós são numerados começando da
raiz, de cima para baixo e da esquerda
para a direita, sem que haja a ausência
de nós.
UDESC – Prof. Kariston Pereira
14
Implementação (1/4)

Nós de uma árvore podem ser representados:



Estaticamente.
Dinamicamente.
Estaticamente, usa-se vetores:

Para cada nó i, seu filho à esquerda está em 2i +
1 e seu filho à direita está em 2i + 2.
UDESC – Prof. Kariston Pereira
15
Implementação (2/4)

Representação Dinâmica:



Nós são implementados como registros (alocados
dinamicamente) ou classes.
Cada nó tem campos que armazenam a informação
propriamente dita e referências a seus nós filhos.
Exemplo em C (quando o percurso é feito sempre de
cima para baixo, da raiz para as folhas):
struct no
{
char info;
struct node *left;
struct node *right;
};
typedef struct no node;
UDESC – Prof. Kariston Pereira
16
Implementação (3/4)

Representação dos nós.
A
A
B
D
E
G
B
C
F
D
C
E
F
G
UDESC – Prof. Kariston Pereira
17
Implementação (4/4)

Funções típicas em uma Árvore Binária:







Inicializar árvore vazia (maketree);
Incluir nó (setleft, setright);
Pesquisar nó (informação);
Excluir nó;
Remover sub-árvore;
Calcular altura da árvore;
Percorrer a árvore (pré-, em-, pós-ordem).
UDESC – Prof. Kariston Pereira
18
Funções Típicas Essenciais
node* maketree(int x)
{
node *p;
p = getnode();
p->info = x;
p->left = NULL;
p->right = NULL;
return (p);
}
setleft (node *p, int x)
{
if (p == null) printf (“inserção vazia\n”);
else if (p->left != NULL)
printf (“inserção incorreta\n”);
else
p->left = maketree(x);
}
setright (node *p, int x)
{
if (p == null) printf (“inserção vazia\n”);
else if (p->right != NULL)
printf (“inserção incorreta\n”);
else
p->right = maketree(x);
}
UDESC – Prof. Kariston Pereira
19
Funções Típicas Essenciais
Algoritmo Exemplo para “Inserção Ordenada Sem Repetição”
int number;
node *tree, *p, *q;
scanf(“%d”, &number);
tree = maketree(number);
while (houver números na entrada)
{
scanf(“%d”, &number);
p = q = tree;
while (number != info(p) && q != NULL)
{
p = q;
if (number < info(p))
q = left (p); //obtem o filho esq. de p
else
q = right (p); //obetem o filho dir. de p
}
if (number == info(p))
printf (“%d %s\n”, number, “está repetido!”);
else if (number < info(p))
setleft (p, number);
else
setright (p, number);
UDESC – Prof. Kariston Pereira
}
20
Travessia em Árvores Binárias

Há várias maneiras de percorrer os nós de uma árvore binária:

Pré-ordem: lê nó, percorre sub-árvore esquerda, percorre sub-árvore
direita


Em-ordem: percorre sub-árvore esquerda, lê nó, percorre sub-árvore
direita


(/ + a * b c d).
(a + b * c / d).
Pós-ordem: percorre sub-árvore esquerda, percorre sub-árvore direita, lê
nó

/
(a b c * + d /).
+
a
d
*
b
c
UDESC – Prof. Kariston Pereira
21
Travessia em Árvores Binárias
void pre_ordem(node *n)
{
if (n != null)
{
processa_info(n->info);
pre_ordem(n->left);
pre_ordem(n->right);
}
}
void em_ordem(node *n)
{
if (n != null)
{
em_ordem(n->left);
processa_info(n->info);
em_ordem(n->right);
}
}
void pos_ordem(node *n)
{
if (n != null)
{
pos_ordem(n->left);
pos_ordem(n->right);
processa_info(n->info);
}
}
UDESC – Prof. Kariston Pereira
22
Aplicações Árvores Binárias

Representação de expressões.

Algoritmos de Ordenação (HeapSort).

Busca (Árvores Binárias de
Busca/Pesquisa).
UDESC – Prof. Kariston Pereira
23
Exercícios




Criar uma Árvore Binária, Incluir alguns
dados e Implementar os algoritmos de
travessia/caminhamento apresentados:
Pré-Ordem;
Em Ordem;
Pós-Ordem.
UDESC – Prof. Kariston Pereira
24
Download

Árvores Binárias