Escolar Documentos
Profissional Documentos
Cultura Documentos
Lvia N. Andrade
rvores AVL
-2
Diferena de altura do
n filho do n
desbalanceado
Tipo de rotao
Simples esquerda
Simples esquerda
-1
Simples direita
-1
Simples direita
Exemplos de Balanceamento
Rotao simples esquerda
rvore Balanceada
rvore
Desbalanceada
2
+ 12
12
rvore
Balanceada
Rotao simple
para a esquerd
8
0
12
Cdigo em C
// n desbalanceado = 2
pu
(*p)->balanceamento = 0;
(*h) = 0;
}
12
Cdigo em C
// n desbalanceado = 2
pu
(*p)->balanceamento = 0;
(*h) = 0;
}
12
Cdigo em C
// n desbalanceado = 2
pu
(*p)->balanceamento = 0;
(*h) = 0;
}
12
Cdigo em C
// n desbalanceado = 2
(*p)->balanceamento = 0; //atualiza FB de p
(*h) = 0;
}
12
-2
Diferena de altura do
n filho do n
desbalanceado
Tipo de rotao
Simples esquerda
Simples esquerda
-1
Simples direita
-1
Simples direita
Rotao para a
direita no filho do
n
desbalanceado
rvore Balanceada
7
6
+7
rvore
Desbalanceada
2
7
0
Rotao para
a esquerda no
n
desbalancead
rvore
-1
// n desbalanceado = 2
Apontador pv = pu->Esq;
printf("rotacao dupla direita-esquerda com %ld\n", pv>Reg.Chave);
pu->Esq = pv->Dir;
pv->Dir = pu;
pu
(*p)->balanceamento = 0;
(*h) = 0;
7 pv
-1
// n desbalanceado = 2
Apontador pv = pu->Esq;
printf("rotacao dupla direita-esquerda com %ld\n", pv>Reg.Chave);
pu->Esq = pv->Dir;
(*p) = pv;
}
(*p)->balanceamento = 0;
(*h) = 0;
pv
-1
pu
// n desbalanceado = 2
Apontador pv = pu->Esq;
printf("rotacao dupla direita-esquerda com %ld\n", pv->Reg.Chave);
pu->Esq = pv->Dir;
pv
(*p)->balanceamento = 0;
(*h) = 0;
}
p 6
-1
pu
// n desbalanceado = 2
Apontador pv = pu->Esq;
printf("rotacao dupla direita-esquerda com %ld\n", pv->Reg.Chave);
pu->Esq = pv->Dir;
pv
(*p)->balanceamento = 0;
(*h) = 0;
}
p 6
-1
pu
// n desbalanceado = 2
Apontador pv = pu->Esq;
printf("rotacao dupla direita-esquerda com %ld\n", pv->Reg.Chave);
pu->Esq = pv->Dir;
pv
(*p)->balanceamento = 0;
(*h) = 0;
}
p 6
0
pu
// n desbalanceado = 2
Apontador pv = pu->Esq;
printf("rotacao dupla direita-esquerda com %ld\n", pv->Reg.Chave);
pu->Esq = pv->Dir;
(*p)->balanceamento = 0; //atualiza FB de p
(*h) = 0;
}
-2
Diferena de altura do
n filho do n
desbalanceado
Tipo de rotao
Simples esquerda
Simples esquerda
-1
Simples direita
-1
Simples direita
6
0
rvore
Desbalanceada
-2
+5
1
Rotao para a
esquerda no filho
do n
desbalanceado
3
0
rvore Balanceada
0
-2
-1
0
Rotao para a
direita no n
desbalanceado
rvore
// n desbalanceado = -2
Apontador pv = pu->Dir;
printf("rotacao dupla esquerda-direita com %ld\n", pv>Reg.Chave);
pu->Dir = pv->Esq;
pv->Esq = pu;
p
1
pu
(*p)->balanceamento = 0;
(*h) = 0;
0
pv
-2
// n desbalanceado = -2
Apontador pv = pu->Dir;
printf("rotacao dupla esquerda-direita com %ld\n", pv>Reg.Chave);
pu->Dir = pv->Esq;
}
(*p)->balanceamento = 0;
(*h) = 0;
1
pu
p
pv
-2
// n desbalanceado = -2
Apontador pv = pu->Dir;
printf("rotacao dupla esquerda-direita com %ld\n", pv->Reg.Chave);
pu->Dir = pv->Esq;
}
(*p)->balanceamento = 0;
(*h) = 0;
}
1
pu
pv
-2
// n desbalanceado = -2
Apontador pv = pu->Dir;
printf("rotacao dupla esquerda-direita com %ld\n", pv->Reg.Chave);
pu->Dir = pv->Esq;
//atualiza FB de p
}
(*p)->balanceamento = 0;
(*h) = 0;
}
1
pu
pv
// n desbalanceado = -2
Apontador pv = pu->Dir;
printf("rotacao dupla esquerda-direita com %ld\n", pv->Reg.Chave);
pu->Dir = pv->Esq;
//atualiza FB de p
//atualiza FB de p
(*p) = pv;
0
}
(*p)->balanceamento = 0;
(*h) = 0;
}
0
pu
pv
// n desbalanceado = -2
Apontador pv = pu->Dir;
printf("rotacao dupla esquerda-direita com %ld\n", pv->Reg.Chave);
pu->Dir = pv->Esq;
//atualiza FB de p
//atualiza FB de p
//pv agora p
}
(*p)->balanceamento = 0; //atualiza FB de p
(*h) = 0;
}
-2
Diferena de altura do
n filho do n
desbalanceado
Tipo de rotao
Simples esquerda
Simples esquerda
-1
Simples direita
-1
Simples direita
Exemplos de Balanceamento
Rotao simples direita
rvore Balanceada
8
0
rvore
Desbalanceada
-2
-1
+2
-1
6
0
rvore
Balanceada
0
0
6
8
Rotao simples
para a direita
Cdigo em C
// n desbalanceado = -2
(*p) = pu;
}
-1
(*p)->balanceamento = 0;
(*h) = 0;
}
pu
-2
Cdigo em C
// n desbalanceado = -2
-1
}
(*p)->balanceamento = 0;
(*h) = 0;
}
6 pu
p
-2
Cdigo em C
// n desbalanceado = -2
-1
}
(*p)->balanceamento = 0;
(*h) = 0;
}
6 pu
p
Cdigo em C
// n desbalanceado = -2
}
(*p)->balanceamento = 0; //atualiza FB de p
(*h) = 0;
}
6 p
8
Exerccio 1
Exerccio 2
Determinado sistema armazena registros por
chaves numricas em uma rvore AVL.
Nessa rvore so inseridos os seguintes
valores: 20,10,5,30,25,27 e 28 nessa
ordem.
Apresente passo a passo como a rvore vai
sendo construda. Realize as rotaes
necessrias e indique qual rotao foi
realizada em cada caso.
Resolvendo o Exerccio 2
1) Insero das chaves 20 e 10, nessa ordem
Referncias Utilizadas
Livro:
ASCENCIO, A. F. G.; ARAJO, G. S. Estruturas de dados:
algoritmos, anlise da complexidade e implementaes
em Java e C/C++. So Paulo: Pearson Prentice Hall, 2010.