Prof.

Adriano Teixeira de Souza

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árvores, 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.

Fundamentos básicos
◦ GRAU – número de subárvores de um nó.

◦ FOLHA – um nó que possui grau zero, ou seja, não possui subárvores.
◦ FILHOS – são as raízes das subárvores de um nó. ◦ Nó não terminal é um nó que não é uma folha e é diferente da raiz.

◦ Todos os nós são acessíveis a partir da raiz. ◦ Uma árvore nula tem altura 0. ◦ Existe um único caminho entre a raiz e qualquer outro nó. Fundamentos básicos ◦ A altura de uma árvore é o comprimento do caminho mais longo da raiz até uma das folhas. .

 Formas de representação gráfica .

ou seja. isto é. ◦ Nenhum nó tem grau superior a 2 (dois). Árvore Binária: Uma árvore binária é uma árvore que pode ser nula. ◦ Existe um “senso de posição”. nenhum nó tem mais de dois filhos. distingue-se entre uma subárvore esquerda e uma subárvore direita. . ou então tem as seguintes características: ◦ Existe um nó especial denominado raiz.

 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 posfixa ◦ Em nível . Atravessamento (ou caminhamento) de árvore é a passagem de forma sistemática por cada um de seus nós.

segundo este caminhamento. . segundo este caminhamento. ◦ caminhar na subárvore à direita. Pré-ordem (prefixa) ◦ visitar a raiz. ◦ caminhar na subárvore à esquerda.

 Atravessamento em ordem (infixa) ◦ caminhar na subárvore à esquerda. segundo este caminhamento. ◦ visitar a raiz. ◦ caminhar na subárvore à direita. . segundo este caminhamento.

. ◦ c) visitar a raiz. segundo este caminhamento. ◦ b) caminhar na subárvore à direita. Atravessamento pós-ordem (posfixa) ◦ a) caminhar na subárvore à esquerda. segundo este caminhamento.

 Atravessamento em nível ◦ Percorre-se a árvore de cima para baixo e da direita para a esquerda. .

 Árvore Estritamente Binária: ◦ É uma árvore binária na qual todo nó tem 0 ou 2 subárvores. ou seja. . nenhum nó tem “filho único”.

◦ Uma árvore binária cheia de altura h tem 2h – 1 nós. exceto os do último nível. . Árvore Binária Cheia ◦ Todos os nós. possuem exatamente duas subárvores.

e a árvore tem o mesmo número de níveis que de nós . Árvore Degenerada ◦ Cada nó possui exatamente um filho.

. ◦ Nenhum elemento da subárvore direita é menor que o elemento raiz. Uma árvore é denominada árvore binária de busca se: ◦ Todo elemento da subárvore esquerda é menor que o elemento raiz. ◦ As subárvores direita e esquerda também são árvores de busca binária.

até alcançar-se o nó folha da árvore. encontrando ou não o valor requerido. e assim recursivamente. ◦ Se o valor for maior que a raiz. em todos os nós da subárvore. deve-se buscar na subárvore da direita. ◦ Se o valor for menor do que a raiz. então deve buscar-se na subárvore da esquerda. Busca ◦ Se o valor for igual à raiz. o valor existe na árvore. .

. ◦ Compara a chave a ser inserida com a chave do nó analisado:  Se menor. insere a chave na subárvore direita. cria um novo no e insere as informações do novo nó. insere a chave na subárvore esquerda.  Se maior. Inserção ◦ Se a árvore estiver vazia.

 Inserção  Exemplo: ◦ Inserir os seguintes elementos: 7. . 13. 11 . 18. 4. 5. 20. 1.

Para excluir um nó de uma árvore binária de busca. Remoção  A remoção de um nó é um processo mais complexo. há de se considerar três casos distintos: ◦ Remoção na folha ◦ Remoção de um nó com um filho ◦ Remoção de um nó com dois filhos .

. basta removê-lo da árvore. Remoção na folha ◦ A exclusão na folha é a mais simples.

. o filho sobe para a posição do pai. Remoção de um nó com um filho ◦ Excluindo-o.

 Substitui-se o valor do nó a ser retirado pelo valor antecessor (o nó mais à direita da subárvore esquerda) . Remoçã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).

 Remoção de um nó com dois filhos ◦ Exemplo de remoção substituindo o nó pelo seu antecessor. .

 Remoção de um nó com dois filhos ◦ Exemplo de remoção substituindo o nó pelo seu sucessor. .

 Árvore é representada pelo ponteiro para o nó raiz struct noArv { int info. struct noArv* esq. typedef struct noArv NoArv. }. . struct noArv* dir.

 Árvore vazia representada por NULL: NoArv* abb_cria (void) { return NULL. } .

percorrendo os nós em ordem simétrica void abb_imprime (NoArv* a) { if (a != NULL) { abb_imprime(a->esq). abb_imprime(a->dir). printf("%d\n". Imprime os valores da árvore em ordem crescente.a->info). } } .

else if (r->info < v) return abb_busca (r->dir. v). else return r. v).Explora a propriedade de ordenação da árvore  Possui desempenho computacional proporcional à altura NoArv* abb_busca (NoArv* r. }  . else if (r->info > v) return abb_busca (r->esq. int v) { if (r == NULL) return NULL.

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 sae ou na sad. conforme o resultado da comparação .   recebe um valor v a ser inserido retorna o eventual novo nó raiz da (sub-)árvore para adicionar v na posição correta.

else if (v < a->info) a->esq = abb_insere(a->esq. return a. as sub-árvores à esquerda ou à direita quando da chamada recursiva da função.v). a->info = v.NoArv* abb_insere (NoArv* a.v). pois a função de inserção pode alterar } o valor do ponteiro para a raiz da (sub-)árvore. else /* v >= a->info */ a->dir = abb_insere(a->dir. int v) { if (a==NULL) { a = (NoArv*)malloc(sizeof(NoArv)). é necessário atualizar os ponteiros para a->esq = a->dir = NULL. } .

Cria insere insere insere insere insere insere insere insere insere 6 8 4 5 2 3 1 9 7 .

retire o elemento da subárvore à direita  se for igual a v. retire a raiz da árvore . 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 do que v.   recebe um valor v a ser inserido retorna a eventual nova raiz da árvore para remover v.

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 . para retirar a raiz da árvore.

que passa a ser NULL . Caso 1: a raiz da sub-árvore é folha da árvore original ◦ libere a memória alocada pela raiz ◦ retorne a raiz atualizada.

 Caso 2: a raiz a ser retirada possui um único filho ◦ libere a memória alocada pela raiz ◦ a raiz da árvore passa a ser o único filho da raiz .

 Caso 3: a raiz a ser retirada tem dois filhos ◦ encontre 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 N ◦ retire 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) .

v). } . else { /* achou o nó a remover */ /* nó sem filhos */ if (r->esq == NULL && r->dir == NULL) { free (r). v). else if (r->info > v) r->esq = abb_retira(r->esq. } /* nó só tem filho à direita */ else if (r->esq == NULL) { NoArv* t = r. int v) { if (r == NULL) return NULL. else if (r->info < v) r->dir = abb_retira(r->dir.NoArv* abb_retira (NoArv* r. r = NULL. r = r->dir. free (t).

} . /* troca as informações */ f->info = v. free (t)./* só tem filho à esquerda */ else if (r->dir == NULL) { NoArv* t = r. } r->info = f->info. while (f->dir != NULL) { f = f->dir. } } return r. r->esq = abb_retira(r->esq.v). } /* nó tem os dois filhos */ else { NoArv* f = r->esq. r = r->esq.

Sign up to vote on this title
UsefulNot useful