View
1.277
Download
2
Category
Preview:
Citation preview
Arvore Binária
Árvores São estruturas de dados adequadas para a
representação de hierarquias.
Uma árvore é composta por um conjunto de nós.
Existe um nó r, denominado raiz, que contém zero ou mais subárvore, cujas raízes são ligadas diretamente a r.
A raiz se liga a um ou mais elementos, e cada um destes forma uma nova subárvore. Esses elementos são seus galhos ou filhos.
Árvores
Fundamentos básicos
GRAU – número de subárvore de um nó.
FOLHA – um nó que possui grau zero, ou seja, não possui subárvore.
FILHOS – são as raízes das subárvore de um nó.
Nó não terminal é um nó que não é uma folha e é diferente da raiz.
Árvores
Fundamentos básicos
A altura de uma árvore é o comprimento do caminho mais longo da raiz até uma das folhas.
Uma árvore nula tem altura 0.
Todos os nós são acessíveis a partir da raiz.
Existe um único caminho entre a raiz e qualquer outro nó.
Árvores
Formas de representação gráfica
Árvore Binária
Árvore Binária: Uma árvore binária é uma árvore que pode ser nula, ou então tem as seguintes características:
Existe um nó especial denominado raiz;
Nenhum nó tem grau superior a 2 (dois), isto é, nenhum nó tem mais de dois filhos;
Existe um “senso de posição”, ou seja, distingue-se entre uma subárvore esquerda e uma subárvore direita.
Árvore Binária
Atravessamento (ou caminhamento) de árvore é a passagem de forma sistemática por cada um de seus nós;
Diferentes formas de percorrer os nós de uma árvore:
Pré-ordem ou prefixa (busca em profundidade)Em ordem ou infixa (ordem central)Pós-ordem ou posfixaEm nível
Árvore BináriaPré-ordem (prefixa)
•Visitar a raiz;•Caminhar na subárvore à esquerda, segundo este caminhamento;•Caminhar na subárvore à direita, segundo este caminhamento.
Árvore BináriaAtravessamento em ordem (infixa)
•Caminhar na subárvore à esquerda, segundo este caminhamento;•Visitar a raiz;•Caminhar na subárvore à direita, segundo este caminhamento.
Árvore BináriaAtravessamento pós-ordem (posfixa)
•Caminhar na subárvore à esquerda, segundo este caminhamento;•Caminhar na subárvore à direita, segundo este caminhamento.•Visitar a raiz;
Árvore BináriaAtravessamento em nível
•Percorre-se a árvore de cima para baixo e da esquerda para a direira.
Árvore BináriaÁrvore Estritamente Binária:
•É uma árvore binária na qual todo nó tem 0 ou 2 subárvore, ou seja, nenhum nó tem “filho único”.
Árvore BináriaÁrvore Binária Cheia
•Todos os nós, exceto os do último nível, possuem exatamente duas subárvore.•Uma árvore binária cheia de altura h tem 2h – 1 nós.
Árvore BináriaÁrvore Degenerada
•Cada nó possui exatamente um filho, e a árvore tem o mesmo número de níveis que de nós.
Árvore Binária de Busca Uma árvore é denominada árvore binária de busca
se:
Todo elemento da subárvore esquerda é menor que o elemento raiz;
Nenhum elemento da subárvore direita é menor que o elemento raiz;
As subárvore direita e esquerda também são árvores de busca binária;
Árvore Binária de Busca Busca
Se o valor for igual à raiz, o valor existe na árvore.
Se o valor for menor do que a raiz, então deve buscar-se na subárvore da esquerda, e assim recursivamente, em todos os nós da subárvore.
Se o valor for maior que a raiz, deve-se buscar na subárvore da direita, até alcançar-se o nó folha da árvore, encontrando ou não o valor requerido.
Árvore Binária de Busca Inserção
Se a árvore estiver vazia, cria um novo nó e insere as informações do novo nó.
Compara a chave a ser inserida com a chave do nó analisado:
Se menor, insere a chave na subárvore esquerda;
Se maior, insere a chave na subárvore direita.
Árvore Binária de BuscaInserção
Exemplo:•Inserir os seguintes elementos: 7, 13, 20, 4, 1, 18, 5, 11.
Árvore Binária de Busca Remoção
A remoção de um nó é um processo mais complexo. Para excluir um nó de uma árvore binária de busca, há de se considerar três casos distintos:
o Remoção na folha;o Remoção de um nó com um filho;o Remoção de um nó com dois filhos.
Árvore Binária de BuscaRemoção na folha
•A exclusão na folha é a mais simples, basta removê-lo da árvore.
Árvore Binária de BuscaRemoção de um nó com um filho
•Excluindo-o, o filho sobe para a posição do pai.
Árvore Binária de BuscaRemoção de um nó com dois filhos
•Neste caso, pode-se operar de duas maneiras diferentes:
•Substitui-se o valor do nó a ser retirado pelo valor sucessor (o nó mais à esquerda da subárvore direita);
•Substitui-se o valor do nó a ser retirado pelo valor antecessor (o nó mais à direita da subárvore esquerda).
Árvore Binária de BuscaRemoção de um nó com dois filhos
•Exemplo de remoção substituindo o nó pelo seu antecessor.
Árvore Binária de BuscaRemoção de um nó com dois filhos
•Exemplo de remoção substituindo o nó pelo seu sucessor.
Tipo Árvore Binária de Busca Árvore é representada pelo ponteiro para o nó raiz.
struct noArv {
int info;
struct noArv* esq;
struct noArv* dir;
};
typedef struct noArv NoArv;
Criação Árvore vazia representada por NULL:
NoArv* abb_cria(void){
return NULL;
}
Impressão Imprime os valores da árvore em ordem crescente,
percorrendo os nós em ordem simétrica:
void abb_imprime (NoArv* a){
if (a != NULL) {
abb_imprime(a -> esq);
printf(“%d\n”,a -> info);
abb_imprime(a ->dir);
}
}
Busca Explora a propriedade de ordenação da árvore; Possui desempenho computacional proporcional à
altura.
NoArv* abb_busca (NoArv* r, int v){if (r == NULL) return NULL;else if (r -> info > v) return abb_busca (r -> esq, v);else if (r -> info < v) return abb_busca (r -> dir, v);else return r;
}
Inserção Recebe um valor v a ser inserido Retorna o eventual novo nó raiz da (sub-) árvore Para adicionar v na posição correta, faça:
Se a (sub-) árvore for vazia○ Crie uma árvore cuja raiz contém v
Se a (sub-) árvore não for vazia○ Compare v com o valor na raiz○ Insira v na subárvore esquerda ou na subárvore direita,
conforme o resultado da comparação.
Exemplo InserçãoNoArv* abb_insere (NoArv* a, int v){
if (a == NULL) {a = (NoArv*) malloc(sizeof(NoArv));a -> info = v;a -> esq = a -> dir = NULL;
}else if (v < a -> info)
a -> esq = abb_insere(a -> esq, v);else /* v >= a -> info */
a -> dir = abb_insere (a -> dir, v);return a;
}
é necessário atualizar os ponteiros paraas sub-árvores à esquerda ou à direitaquando da chamada recursiva da função,pois a função de inserção pode alteraro valor do ponteiro para a raiz da (sub-)árvore.
Inserção
Cria
Insere 6
Insere 8
Insere 4
Insere 5
Insere 2
Insere 3
Insere 1
Insere 9
Insere 7
Remoção Recebe um valor v a ser inserido Retorna a eventual nova raiz da árvore Para remover v, faça:
Se a árvore for vazia○ Nada tem que ser feito
Se a árvore não for vazia○ Compare o valor armazenado no nó raiz com v○ Se for maior que v, retire o elemento da sub-árvore à esquerda○ Se for menor que v, retire o elemento da sub-árvore à direita○ Se for igual a v, retire a raiz da árvore
Remoção Para retirar a raiz da árvore, há 3 casos:
Caso 1: a raiz que é folha
Caso 2: a raiz a ser retirada possui um único filho
Caso 3: a raiz a ser retirada tem dois filhos.
Remoção de folha Caso 1: a raiz da sub-árvore é folha da árvore original
Libere a memória alocada pela raizRetorne a raiz atualizada, que passa a ser NULL
Remoção de pai de filho único
Caso 2: a raiz a ser retirada possui um único filhoLibere a memória alocada pela raizA raiz da árvore passa a ser o único filho da raiz
Remoção de pai de dois filhos
Caso 3: a raiz a ser retirada tem dois filhoEncontre o nó N que precede a raiz na ordenação (o
elemento mais à direita da sub-árvore à esquerda)Troque o dado da raiz com o dado de NRetire N da sub-árvore à esquerda (que agora contém o
dado da raiz que se deseja retirar)○ Retirar o nó N mais à direita é trivial, pois N é um nó folha ou N
é um nó com um único filho (no caso, o filho da direita nunca existe)
NoArv* abb_retira (NoArv* r, int v) {if (r == NULL) return NULL;else if (r -> info > v) r->esq = abb_retira (r -> esq, v);else if (r->info < v)
r->dir = abb_retira(r->dir, v);else { /* achou o nó a remover *//* nó sem filhos */if (r->esq == NULL && r->dir == NULL) {
free (r);r = NULL;
}/* nó só tem filho à direita */else if (r->esq == NULL) {
NoArv* t = r;r = r->dir;free (t);
}
/* só tem filho à esquerda */else if (r->dir == NULL) {
NoArv* t = r;r = r->esq;free (t);
}/* nó tem os dois filhos */else {
NoArv* f = r->esq;while (f->dir != NULL) {
f = f->dir;}r->info = f->info; /* troca as informações */f->info = v;r->esq = abb_retira(r->esq,v);
}}return r;
}
“As árvores da computação têm a tendência de crescer para baixo: a raiz fica no ar enquanto as
folhas se enterram no chão."
Recommended