Você está na página 1de 19

Estrutura

de Dados
Prof. Felipe Cavalaro
Árvore (Tree)
O que é uma árvore?
Árvore (Tree)
O que é uma árvore?
Árvore (Tree)
É um novo tipo de dados que consiste em arestas e vértices.
Diferentemente de uma árvore natural, estas são representadas de
cima para baixo, com a raiz no topo e as folhas na base (nós
terminais). A raiz é um nó que não tem ancestrais; só pode ter nós
filhos. As folhas, por outro lado, não têm filhos, ou melhor, seus
filhos são estruturas vazias. (DROZDEK, 2017).
Árvore (Tree)
Cada nó tem que ser atingível a partir da raiz através de uma
sequência única de arestas, chamada caminho. O número de
arestas em um caminho é chamado comprimento do caminho. O
nível de um nó é o comprimento do caminho da raiz ao nó mais 1,
que é o número de nós no caminho. A altura de uma árvore não
vazia é o nível máximo de um nó na árvore. A árvore vazia é uma
árvore legítima de altura 0 (por definição), e um nó único é uma
árvore de altura 1. Este é o único caso no qual um nó é raiz e folha.
(DROZDEK, 2017).
Árvore (Tree)
Representações e Aplicações
Árvore
typedef struct tree {
int info;
struct tree *esq;
struct tree *dir;
}arv; esq info dir
Árvore
arv* cria () {
return NULL;
}

int vazia (arv* a) {


return a==NULL;
}
Árvore
arv* insere (arv* a, int dado) {
if (a==NULL) {
a = (arv*)malloc(sizeof(arv));
a->info = dado;
a->esq = a->dir = NULL;
} else if (dado < a->info)
a->esq = insere(a->esq,dado);
else/* dado >= a->info */
a->dir = insere(a->dir,dado);
return a;
}
Árvore
arv* libera (arv* a){
if (!vazia(a)){
libera(a->esq); /* libera sae */
libera(a->dir); /* libera sad */
free(a); /* libera raiz */
}
return NULL;
}
Árvore
void imprime (arv* a){
if (a != NULL) {
imprime(a->esq);
printf("%d\n",a->info);
imprime(a->dir);
}
}
Árvore
arv* busca (arv* a, int dado) {
if (a == NULL) return NULL;
else if (a->info > dado)
return busca (a->esq, dado);
else if (a->info < dado)
return busca (a->dir, dado);
else return a;
}
Árvore
Árvore /* só tem filho à esquerda */
else if (a->dir == NULL) {
arv* retira (arv* a, int dado) {
if (a == NULL) return NULL; arv* t = a;

else if (a->info > dado) a = a->esq;


a->esq = retira(a->esq, dado); free (t);
else if (a->info < dado) } /* nó tem os dois filhos */
a->dir = retira(a->dir, dado); else {
else { /* achou o nó a remover */ arv* f = a->esq;
/* nó sem filhos */
while (f->dir != NULL) {
if (a->esq == NULL && a->dir == NULL) {
f = f->dir;
free (a);
}
a = NULL;
a->info = f->info;
} /* nó só tem filho à direita */
else if (a->esq == NULL) { /* troca as informações */

arv* t = a; f->info = dado;

a = a->dir; a->esq = retira(a->esq, dado);


free (t); }
} }
Exemplo

Faça uma função que receba como parâmetro uma árvore conforme a estrutura abaixo e retorno
quantos nós há nessa árvore.
typedef struct tree {
int info;
struct tree *esq;
struct tree *dir;
}arv;
Exercícios
1) Escreva uma função que retorne a altura de um árvore binária.
Use o cabeçalho: int altura(arv *a)
Exercícios
2) Escreva uma função que retorne a quantidade de folhas em uma árvore binária.
Use o cabeçalho: int quant_folhas(arv *a)
Exercícios
3) Escreva uma função que exclua todas as folhas de uma árvore binária, deixando a raiz e
os nós intermediários no respectivo lugar. Use o cabeçalho: arv* exclui_folhas(arv *a)
Obrigado
felipe.cavalaro@fatec.sp.gov.br

Você também pode gostar