Вы находитесь на странице: 1из 7

Segunda avaliao de Estrutura de Dados

Segundo semestre de 2014 PPG-CC Prof. Dr. Ednaldo Pizzolato


Questes:
1) (1.0) Considere a afirmao: uma rvore-B no pode crescer em profundidade at que esteja 100% cheia.
Discuta essa afirmao. Ela correta? Explique sua resposta.
R.: Considere o seguinte exemplo com ns tendo, no mximo, 4 elementos. So inseridos, primeiramente, 4
valores. Como a raiz comporta os cinco valores, nada acontece. Depois tenta-se inserir um quinto valor
(450), o que ocasionar a ciso do n raiz, gerando 3 ns. Com este primeiro passo, pode-se ter a incorreta
concluso que para aumentar a altura da rvore preciso ter 100% da rvore preenchida (como afirma o
enunciado da questo). Continuemos a inserir elementos na rvore...

50

150

250

350

450

350

450

250
50

150

250
50

150

50

50

50

150

150

150

350

450

250

550

350

450

250

550

350

450

250

550

350

450

550

650

650

750

650

750

750

850

950

980

950

980

850

650

750

At o momento temos para o n raiz 75% de ocupao; n folha 1 50%; n folha 2 50%, n folha 3
50; e n folha 4 50%. Se continuarmos inserindo elementos em um determinado n (qualquer um),
isso far com que o n exceda sua capacidade mxima e faa o n raiz crescer para 4 elementos. Se
mantivermos a poltica de inserir elementos em um determinado n, ento a raiz receber um novo
elemento e ter que se dividir, aumentando a altura da rvore. Vale ressaltar que a rvore no precisou ficar
100% preenchida para ocorrer o aumento de altura. Portanto, a afirmao falsa.

Segunda avaliao de Estrutura de Dados


Segundo semestre de 2014 PPG-CC Prof. Dr. Ednaldo Pizzolato
2) (2.0) Insira em uma rvore AVL, itens com as chaves apresentadas a seguir (na ordem em que aparecem).
Desenhe a rvore resultante da insero, sendo que uma nova rvore deve ser desenhada quando houver
uma rotao e indique qual a rotao que foi executada.
22, 18, 25, 72, 15, 12, 87, 94, 98, 99, 30

22

22

22

18

22

18

18

25

25

72
22

18

22

25

18

15

72

25

15

72

12

22

22

15

12

15

25

18

12

72

25

18

72

87
22

15

12

72

18

25

87

Segunda avaliao de Estrutura de Dados


Segundo semestre de 2014 PPG-CC Prof. Dr. Ednaldo Pizzolato

22

22

15

15

72

12

18

12

87

25

72

18

25

87

94

94

15

15

72

12

18

25

12

94

72

18

25

15

94

72

12

98

87

25

94

18

99

94
30

87

98

87

30

25

18

72

25

72

12

99

22

15

15

98

87

22

18

94

98

87

12

98

22

22

98
99

99

Segunda avaliao de Estrutura de Dados


Segundo semestre de 2014 PPG-CC Prof. Dr. Ednaldo Pizzolato
3) (2.0) Considere uma estrutura em C/C++ que contenha:
a. uma chave inteira;
b. um valor inteiro responsvel por indicar o fator de balanceamento;
c. um ponteiro para n pai (similar ao n aqui descrito);
d. um ponteiro para n filho a esquerda (similar ao n aqui descrito); e
e. um ponteiro para n filho a direita (similar ao n aqui descrito);
O que o cdigo XXX a seguir faz? Explique.
Avl*
{

XXX (Avl *r)


Avl *pai = r->pai, *t = r->esq, *m = t->dir;
t->dir = r; r->pai = t; r->esq = m;
if (m) m->pai = r;
t->pai = pai;
if (pai) {
if (pai->dir == r) pai->dir = t;
else pai->esq = t;
}
t->fb = r->fb = 0;
return t;

}
R.: Rotao simples a direita.
4) (4.0) Em um dos slides apresentados em sala de aula h a seguinte afirmao: uma rvore pode ser
entendida como um grafo acclico conexo onde um dos vrtices raiz diferenciado dos demais. Ou seja,
se houver um ciclo, a representao deixa de ser rvore e passa a ser um grafo. Existem 2 formas de se ter
um ciclo:
a. (2.0) Um n tem como filho um de seus ancestrais;
b. (2.0) Um n tem mais que um pai;
Apresente a estrutura de dados e o cdigo em C/C++ para resolver as situaes mencionadas.
R.: Se incluirmos um novo elemento na estrutura de dados que pode ser o nmero de visitas ou um
booleano para indicar se o elemento j foi visitado, ento utilizando-se do algoritmo de visita in-order
podemos verificar se um elemento j foi visitado ou no.
struct tNode
{
int data;
bool visited;
struct tNode* left, *right;
};
struct sNode
{
struct tNode *t;
struct sNode *next;
};

Segunda avaliao de Estrutura de Dados


Segundo semestre de 2014 PPG-CC Prof. Dr. Ednaldo Pizzolato
void inOrder(struct tNode *root)
{
struct tNode *current = root;
struct sNode *s = NULL;
bool done = false;
while (!done)
{
if (current->visited)
done = true;
else
current->visited = true;
if(current != NULL)
{
push(&s, current);
current = current->left;
}
else
{
if (!isEmpty(s))
{
current = pop(&s);
current = current->right;
}
else
done = true;
}
}
}
Esta soluo cobre os dois casos.
5) (3.0) Em remoes de elementos em rvores B possvel que o n fique com menos elementos que o
mnimo necessrio. Nestas situaes prefervel fazer redistribuio de chaves a concatenao. Apresente a
estrutura de dados e o respectivo cdigo em C/C++ para fazer a redistribuio.
R.: Seja x a chave a ser removida. Temos 2 casos a considerar:
1. x se encontra em uma folha.
Soluo: a entrada simplesmente retirada;
2. x no se encontra em uma folha
Soluo: x substituda pelo sucessor (que tambm folha)
O caso 2 acaba se tornando o caso 1. Portanto, trataremos apenas do caso 1.

Segunda avaliao de Estrutura de Dados


Segundo semestre de 2014 PPG-CC Prof. Dr. Ednaldo Pizzolato

20

40

25

35

20

40

pai

25

35

45

irmo esquerda

irmo esquerda

45

50

50

60

60

irmo direita

20

45

pai

25

40

50

60

irmo direita

Lembrando que os limites (quanto ao nmero de chaves na pgina) so:


raiz: 1 m 2d
outras: d m 2d
Estrutura de dados:
No *pai;
int pos_pai;
int valores[X];
int filhos[X+1];
bool folha;
int nro_elementos;

Assumindo que a funo remove tenha encontrado o valor a ser removido no n L na posio
pos_to_be_removed e que a funo desloca_esquerda faz o deslocamento de todos os elementos do vetor uma
posio esquerda e que diminui a quantidade de elementos do vetor em 1 unidade:
If (folha) // ento a situao que estamos abordando na questo
{
if (pai->filhos[pos_pai+1]->nro_elementos > MINIMO)
{
valor = pai->valores[pos_pai];
pai->valores[pos_pai] = pai->filhos[pos_pai+1]->valores[0];

Segunda avaliao de Estrutura de Dados


Segundo semestre de 2014 PPG-CC Prof. Dr. Ednaldo Pizzolato
desloca_esquerda(pai->filhos[pos_pai+1]); // desloca todos os elementos a esq.
valores[pos_to_be_removed] = valor;
}
else
if (pai->filhos[pos_pai]->nro_elementos > MINIMO)
{
valor = pai->valores[pos_pai];
pai->valores[pos_pai] = pai->filhos[pos_pai]->valores[nro_elementos-1];
pai->filhos[pos_pai]->nro_elementos--;
valores[pos_to_be_removed] = valor;
}
else
// no teve jeito, vai ter que concatenar!
Como pode-se observar, a redistribuio no propagvel pela rvore, visto que o pai continua com o mesmo
nmero de elementos.

Вам также может понравиться