introdução a Árvores e Árvores binárias prof. kariston pereira adaptado de material gentilmente...
TRANSCRIPT
Introdução a Árvores e Árvores Binárias
Prof. Kariston Pereira
Adaptado de Material gentilmente fornecido pelo Prof. Rui Tramontin (DCC/UDESC)
UDESC – Prof. Kariston Pereira 2
Tópicos Abordados Introdução Definição de Árvore Árvores Binárias
UDESC – Prof. Kariston Pereira 3
Introdução Necessidade de se representar
estruturas de dados hierárquicas.
Estrutura de diretórios Taxonomias Organogramas Sintaxe de expressões
Tais estruturas sãorepresentadas porÁrvores.
UDESC – Prof. Kariston Pereira 4
Introdução Exemplos: expressão, taxonomiaa + (b * c) / d
a
b c
*
+
/
d
Animal
Mamífero Ave Réptil
Primata Cetáceo ......
Homem Gorila Baleia
UDESC – Prof. Kariston Pereira 5
Introdução Exemplo: sistema de arquivos
UDESC – Prof. Kariston Pereira 6
Tópicos Abordados Introdução Definição de Árvore Árvores Binárias
UDESC – Prof. Kariston Pereira 7
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
... sub-árvores
UDESC – Prof. Kariston Pereira 8
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 9
Conceitos Básicos
A
C
G
B
E F
I
D
H
J KNós
folhas
Grau = 3
Nível = 2
Altura = 3
Nós internos
UDESC – Prof. Kariston Pereira 10
Tópicos Abordados Introdução Definição de Árvore Árvores Binárias
UDESC – Prof. Kariston Pereira 11
Á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 12
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 13
Tipos de Árvores Binárias:Quase Completa
Uma Árvore Binária de profundidade d será uma Árvore Binária Quase Completa se:
Cada follha na árvore estiver no nível d ou no nível d – 1 (até o nível d – 1 ela é completa);
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.
N
N
S
UDESC – Prof. Kariston Pereira 14
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.
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.
N
N
S
Tipos de Árvores Binárias:Quase Completa
UDESC – Prof. Kariston Pereira 15
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 16
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 17
Implementação (3/4) Representação dos nós.
A
C
F
B
D E
G
A
B C
D E F
G
UDESC – Prof. Kariston Pereira 18
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 19
Funções Típicas Essenciaisnode* 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 20
Funções Típicas EssenciaisAlgoritmo 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 21
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 (/ + a * b c d).
Em-ordem: percorre sub-árvore esquerda, lê nó, percorre sub-árvore direita (a + b * c / d).
Pós-ordem: percorre sub-árvore esquerda, percorre sub-árvore direita, lê nó
(a b c * + d /).
a
b c
*
+
/
d
UDESC – Prof. Kariston Pereira 22
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 23
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 24
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.