Árvore Binária
-
Upload
wagner-almeida -
Category
Education
-
view
1.277 -
download
2
Transcript of Árvore Binária
![Page 1: Árvore Binária](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/1.jpg)
Arvore Binária
![Page 2: Árvore Binária](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/2.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/3.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/4.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/5.jpg)
Árvores
Formas de representação gráfica
![Page 6: Árvore Binária](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/6.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/7.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/8.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/9.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/10.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/11.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/12.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/13.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/14.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/15.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/16.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/17.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/18.jpg)
Árvore Binária de BuscaInserção
Exemplo:•Inserir os seguintes elementos: 7, 13, 20, 4, 1, 18, 5, 11.
![Page 19: Árvore Binária](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/19.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/20.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/21.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/22.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/23.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/24.jpg)
Á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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/25.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/26.jpg)
Criação Árvore vazia representada por NULL:
NoArv* abb_cria(void){
return NULL;
}
![Page 27: Árvore Binária](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/27.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/28.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/29.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/30.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/31.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/32.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/33.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/34.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/35.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/36.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/37.jpg)
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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/38.jpg)
/* 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](https://reader031.fdocuments.net/reader031/viewer/2022013118/559581601a28abdc3b8b46c0/html5/thumbnails/39.jpg)
“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."