Árvore Binária

39
Arvore Binária

Transcript of Árvore Binária

Page 1: Árvore Binária

Arvore Binária

Page 2: Árvore 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.

Page 3: Árvore Binária

Á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.

Page 4: Árvore Binária

Á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ó.

Page 5: Árvore Binária

Árvores

Formas de representação gráfica

Page 6: Árvore Binária

Á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.

Page 7: Árvore Binária

Á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

Page 8: Árvore Binária

Árvore BináriaPré-ordem (prefixa)

•Visitar a raiz;•Caminhar na subárvore à esquerda, segundo este caminhamento;•Caminhar na subárvore à direita, segundo este caminhamento.

Page 9: Árvore Binária

Á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.

Page 10: Árvore Binária

Á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;

Page 11: Árvore Binária

Árvore BináriaAtravessamento em nível

•Percorre-se a árvore de cima para baixo e da esquerda para a direira.

Page 12: Árvore Binária

Á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”.

Page 13: Árvore Binária

Á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.

Page 14: Árvore Binária

Á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.

Page 15: Árvore Binária

Á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;

Page 16: Árvore 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.

Page 17: Árvore Binária

Á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.

Page 18: Árvore Binária

Árvore Binária de BuscaInserção

Exemplo:•Inserir os seguintes elementos: 7, 13, 20, 4, 1, 18, 5, 11.

Page 19: Árvore Binária

Á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.

Page 20: Árvore Binária

Árvore Binária de BuscaRemoção na folha

•A exclusão na folha é a mais simples, basta removê-lo da árvore.

Page 21: Árvore Binária

Árvore Binária de BuscaRemoção de um nó com um filho

•Excluindo-o, o filho sobe para a posição do pai.

Page 22: Árvore Binária

Á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).

Page 23: Árvore Binária

Árvore Binária de BuscaRemoção de um nó com dois filhos

•Exemplo de remoção substituindo o nó pelo seu antecessor.

Page 24: Árvore Binária

Árvore Binária de BuscaRemoção de um nó com dois filhos

•Exemplo de remoção substituindo o nó pelo seu sucessor.

Page 25: Árvore Binária

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;

Page 26: Árvore Binária

Criação Árvore vazia representada por NULL:

NoArv* abb_cria(void){

return NULL;

}

Page 27: Árvore Binária

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);

}

}

Page 28: Árvore Binária

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;

}

Page 29: Árvore Binária

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.

Page 30: Árvore Binária

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.

Page 31: Árvore Binária

Inserção

Cria

Insere 6

Insere 8

Insere 4

Insere 5

Insere 2

Insere 3

Insere 1

Insere 9

Insere 7

Page 32: Árvore Binária

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

Page 33: Árvore Binária

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.

Page 34: Árvore Binária

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

Page 35: Árvore Binária

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

Page 36: Árvore Binária

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)

Page 37: Árvore Binária

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);

}

Page 38: Árvore Binária

/* 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;

}

Page 39: Árvore Binária

“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."