Estrutura e Balanceamento de Árvores AVL
Estrutura e Balanceamento de Árvores AVL
1º semestre/2024
Introdução
2
Introdução
2
Introdução
• Alguns questionamentos:
◦ Seria possı́vel manter a árvore sempre completa após consecutivas
remoções ou inclusões?
◦ Quanto custa isso? Vale o esforço?
2
Um exemplo ruim para o restabelecimento de
árvores completas
8
4 12
2 6 10 14
1 3 5 7 9 11 13
Vamos incluir 0
3
Um exemplo ruim para o restabelecimento de
árvores completas
8 8
4 12
4 12
2 6 10 14
2 6 10 14
1 3 5 7 9 11 13
1 3 5 7 9 11 13
0
Vamos incluir 0 Não é mais completa
3
Um exemplo ruim para o restabelecimento de
árvores completas
8 8
4 12
4 12
2 6 10 14
2 6 10 14
1 3 5 7 9 11 13
1 3 5 7 9 11 13
0
Vamos incluir 0 Não é mais completa
7
3 11
1 5 9 13
0 2 4 6 8 10 12 14
3
Um exemplo ruim para o restabelecimento de
árvores completas
8 8
4 12
4 12
2 6 10 14
2 6 10 14
1 3 5 7 9 11 13
1 3 5 7 9 11 13
0
Vamos incluir 0 Não é mais completa
7
3 11
1 5 9 13
0 2 4 6 8 10 12 14
4
Alternativa — Árvores Balanceadas
4
Alternativa — Árvores Balanceadas
4
Árvore AVL
5
Árvore AVL
Adelson-Vělsky Landis
6
Árvore AVL
Definição
Uma árvore binária T é do tipo AVL se, para todo nó v de T , as alturas
de suas duas subárvores, esquerda e direita, diferem em módulo de até
uma unidade.
7
Árvore AVL
Definição
Uma árvore binária T é do tipo AVL se, para todo nó v de T , as alturas
de suas duas subárvores, esquerda e direita, diferem em módulo de até
uma unidade.
7
Árvore AVL
Definição
Uma árvore binária T é do tipo AVL se, para todo nó v de T , as alturas
de suas duas subárvores, esquerda e direita, diferem em módulo de até
uma unidade.
7
Exemplos de árvores binárias AVL
−1 1
0 0 0 −1
0 0 0
8
Exemplos de árvores binárias AVL
−1 1
0 0 0 −1
0 0 0
8
Exemplos de árvores binárias de busca AVL
1
4
−1 1
2 6
0 0 0 −1
50 1 5 9
0 0 0
23 66 7
9
Árvore completa × Árvore AVL
Fato: Toda árvore completa é AVL, mas nem toda árvore AVL
é completa.
10
Árvore completa × Árvore AVL
Fato: Toda árvore completa é AVL, mas nem toda árvore AVL
é completa.
Árvore completa
10
Árvore completa × Árvore AVL
Fato: Toda árvore completa é AVL, mas nem toda árvore AVL
é completa.
10
Árvore completa × Árvore AVL
Fato: Toda árvore completa é AVL, mas nem toda árvore AVL
é completa.
10
Prova do balanceamento
11
Balanceamento de árvores AVL
12
Balanceamento de árvores AVL
Problema
Dada uma árvore AVL de altura h, qual seria o valor mı́nimo possı́vel
para n?
12
Árvores de Fibonacci
• Árvores AVL com os piores fatores de balanceamento.
T4
T3
T2
T0 T1
NULL
13
Árvores de Fibonacci
• Árvores AVL com os piores fatores de balanceamento.
T4
T3
T2
T0 T1
NULL
Th
Th−2
Th−1
13
Número de nós — Árvores de Fibonacci
• Denotamos por N (T ) o número de nós de uma árvore T
14
Número de nós — Árvores de Fibonacci
• Denotamos por N (T ) o número de nós de uma árvore T
• Número de nós de Th :
0
se h = 0;
N (Th ) = 1 se h = 1;
se h > 1.
1 + N (Th−1 ) + N (Th−2 )
14
Número de nós — Árvores de Fibonacci
• Denotamos por N (T ) o número de nós de uma árvore T
• Número de nós de Th :
0
se h = 0;
N (Th ) = 1 se h = 1;
se h > 1.
1 + N (Th−1 ) + N (Th−2 )
14
Número de nós — Árvores de Fibonacci
• Denotamos por N (T ) o número de nós de uma árvore T
• Número de nós de Th :
0
se h = 0;
N (Th ) = 1 se h = 1;
se h > 1.
1 + N (Th−1 ) + N (Th−2 )
14
Número de nós — Árvores de Fibonacci
15
Número de nós — Árvores de Fibonacci
15
Prova h = O(lg n)
Se T é uma árvore AVL com altura h e com n nós, então h = O(lg n).
16
Prova h = O(lg n)
Se T é uma árvore AVL com altura h e com n nós, então h = O(lg n).
√ √
Prova: Do slide anterior, temos que n ≥ F (h) = √1 ( 1+ 5 )h
5 2 − √15 ( 1−2 5 )h .
16
Prova h = O(lg n)
Se T é uma árvore AVL com altura h e com n nós, então h = O(lg n).
√ √
Prova: Do slide anterior, temos que n ≥ F (h) = √1 ( 1+ 5 )h
5 2 − √15 ( 1−2 5 )h .
√
Como h > 0, temos que √1 ( 1− 5 )h
5 2 < 1.
16
Prova h = O(lg n)
Se T é uma árvore AVL com altura h e com n nós, então h = O(lg n).
√ √
Prova: Do slide anterior, temos que n ≥ F (h) = √1 ( 1+ 5 )h
5 2 − √15 ( 1−2 5 )h .
√
Como h > 0, temos que √1 ( 1− 5 )h < 1.
5 2
√ h
Portanto, n ≥ F (h) > √1
5
1+ 5
2 − 1.
16
Prova h = O(lg n)
Se T é uma árvore AVL com altura h e com n nós, então h = O(lg n).
√ √
Prova: Do slide anterior, temos que n ≥ F (h) = √1 ( 1+ 5 )h
5 2 − √15 ( 1−2 5 )h .
√
Como h > 0, temos que √1 ( 1− 5 )h < 1.
5 2
√ h
Portanto, n ≥ F (h) > √1
5
1+ 5
2 − 1.
√
ah
Fazendo a = 2 ,
1+ 5
tem-se n > √1 ah
5
− 1. O que implica, n + 1 > √
5
.
16
Prova h = O(lg n)
Se T é uma árvore AVL com altura h e com n nós, então h = O(lg n).
√ √
Prova: Do slide anterior, temos que n ≥ F (h) = √1 ( 1+ 5 )h
5 2 − √15 ( 1−2 5 )h .
√
Como h > 0, temos que √1 ( 1− 5 )h < 1.
5 2
√ h
Portanto, n ≥ F (h) > √1
5
1+ 5
2 − 1.
√
ah
Fazendo a = 2 ,
1+ 5
tem-se n > √1 ah
5
− 1. O que implica, n + 1 > √
5
.
Aplicando logaritmo na base a em ambos os lados, temos:
√
loga (n + 1) > loga ah − loga 5
√
loga (n + 1) > h − loga 5
√
h < loga (n + 1) + loga 5
1 √
h< log2 (n + 1) + loga 5 (mudança de base)
log2 a
h < 1.44 · log2 (n + 1) + 1.67 = O(lg n).
16
Inserção em árvores AVL
17
Inserção em Árvores AVL
• Ideia: Após cada inserção, verificar se algum nó p se encontra
desregulado.
◦ Em caso positivo, aplicar transformações apropriadas para regulá-lo.
18
Inserção em Árvores AVL
• Ideia: Após cada inserção, verificar se algum nó p se encontra
desregulado.
◦ Em caso positivo, aplicar transformações apropriadas para regulá-lo.
18
Inserção em Árvores AVL
• Ideia: Após cada inserção, verificar se algum nó p se encontra
desregulado.
◦ Em caso positivo, aplicar transformações apropriadas para regulá-lo.
50
20 60
10 30 9
5 15
18
Inserção em Árvores AVL
19
Inserção em Árvores AVL
19
Inserção em Árvores AVL
19
Inserção em Árvores AVL
19
Inserção em Árvores AVL
19
Inserção em Árvores AVL
19
Inserção em Árvores AVL
19
Inserção em Árvores AVL
19
Rotação Esquerda e Rotação Direita
p u
Rotação
Direita(p)
u p
T3 T1
Rotação
Esquerda(u)
T1 T2 T2 T3
20
Rotação Esquerda e Rotação Direita
p u
Rotação
Direita(p)
u p
T3 T1
Rotação
Esquerda(u)
T1 T2 T2 T3
Propriedade 1
20
Rotação Dupla à Direita
p v
u
Rotação Dupla u p
v T4 à Direita (p)
T1
T2 T3 T1 T2 T3 T4
21
Rotação Dupla à Direita
p v
u
Rotação Dupla u p
v T4 à Direita (p)
T1
T2 T3 T1 T2 T3 T4
p p v
u v
u p
v T4 u T4
T1 T3
T2 T3 T1 T2 T1 T2 T3 T4
21
Rotação Dupla à Esquerda
p y
z
Rotação Dupla p z
T1 y à Esquerda (p)
T4
T2 T3 T1 T2 T3 T4
22
Rotação Dupla à Esquerda
p y
z
Rotação Dupla p z
T1 y à Esquerda (p)
T4
T2 T3 T1 T2 T3 T4
p p y
z y
p z
T1 y T1 z
T4 T2
T2 T3 T3 T4 T1 T2 T3 T4
22
Exemplo
Inclusão da chave 1 na árvore e posterior efeito de uma rotação direita
do nó 5, que tornou-se desregulado após a inclusão de 1.
7
7
5 8
5 8
Insert(1) 3 6 9
3 6 9
2 4
2 4
1
23
Exemplo
Inclusão da chave 1 na árvore e posterior efeito de uma rotação direita
do nó 5, que tornou-se desregulado após a inclusão de 1.
7
7
5 8
5 8
Insert(1) 3 6 9
3 6 9
2 4
2 4
1
7
7
5 8
3 8
3 6 9 RightRotation(5)
2 5 9
2 4
1 4 6
1
23
Análise da operação de inserção
24
Análise da Inserção
25
Análise da Inserção
25
Análise da Inserção
26
Análise da Inserção
26
Análise da Inserção
26
Análise da Inserção
26
Análise da Inserção
26
Análise da Inserção
26
Análise da Inserção
26
Caso 1: hE (p) > hD (p)
27
Caso 1: hE (p) > hD (p)
27
Caso 1: hE (p) > hD (p)
27
Caso 1: hE (p) > hD (p)
27
Caso 1: hE (p) > hD (p)
27
Caso 1: hE (p) > hD (p)
28
Caso 1(b): hE (u) < hD (u)
Solução: Rotação dupla direita em p.
30
Caso 2: hE (p) < hD (p)
30
Caso 2: hE (p) < hD (p)
30
Caso 2: hE (p) < hD (p)
30
Caso 2: hE (p) < hD (p)
30
Caso 2: hE (p) < hD (p)
31
Caso 2(b): hE (u) > hD (u)
Solução: Rotação dupla esquerda em p.
33
Propriedades das rotações
Propriedade 1
Propriedade 2
33
Propriedades das rotações
Propriedade 1
Propriedade 2
Propriedade 3
33
Atividade
Mostre o passo-a-passo da inserção das chaves 1,2,3,4,5,6,7 em uma
árvore AVL inicialmente vazia. Em cada passo, ilustre o valor do fator
de balanceamento de cada nó, assim como as rotações realizadas.
34
Implementação da inserção
35
Como determinar o fator de balanço de um nó?
36
Como determinar o fator de balanço de um nó?
36
Como determinar o fator de balanço de um nó?
36
Como a altura de cada nó é determinada?
• Cada nó da árvore possui o campo height, que guarda sua altura.
• Assim que um nó p é inserido na árvore ele é um nó folha.
◦ A altura de p é igual a 1 logo após sua inserção.
◦ Fazendo p->height = 1 assim que o nó p é inserido, determinamos
sua altura em tempo O(1).
37
Como a altura de cada nó é determinada?
• Cada nó da árvore possui o campo height, que guarda sua altura.
• Assim que um nó p é inserido na árvore ele é um nó folha.
◦ A altura de p é igual a 1 logo após sua inserção.
◦ Fazendo p->height = 1 assim que o nó p é inserido, determinamos
sua altura em tempo O(1).
• Observação: A partir deste momento, os únicos nós da árvore que podem
ter alturas modificadas são os nós no caminho de p até a raiz.
37
Como a altura de cada nó é determinada?
• Cada nó da árvore possui o campo height, que guarda sua altura.
• Assim que um nó p é inserido na árvore ele é um nó folha.
◦ A altura de p é igual a 1 logo após sua inserção.
◦ Fazendo p->height = 1 assim que o nó p é inserido, determinamos
sua altura em tempo O(1).
• Observação: A partir deste momento, os únicos nós da árvore que podem
ter alturas modificadas são os nós no caminho de p até a raiz.
◦ Todos eles devem ser verificados e ter seus campos height
corretamente atualizados.
37
Como a altura de cada nó é determinada?
• Cada nó da árvore possui o campo height, que guarda sua altura.
• Assim que um nó p é inserido na árvore ele é um nó folha.
◦ A altura de p é igual a 1 logo após sua inserção.
◦ Fazendo p->height = 1 assim que o nó p é inserido, determinamos
sua altura em tempo O(1).
• Observação: A partir deste momento, os únicos nós da árvore que podem
ter alturas modificadas são os nós no caminho de p até a raiz.
◦ Todos eles devem ser verificados e ter seus campos height
corretamente atualizados.
◦ Existem O(log n) destes nós e essa atualização pode ser feita em tempo
constante a medida que as chamadas recursivas “se desenrolam”.
37
Arquivo Node.h
1 # ifndef NODE_H
2 # define NODE_H
3
4 struct Node {
5 int key ;
6 int height ;
7 Node * left ;
8 Node * right ;
9 };
10
11 # endif
38
Arquivo Tree.h (com código inicial)
1 # ifndef TREE_H
2 # define TREE_H
3 # include " Node . h "
4
5 class Tree {
6 public :
7 Tree () = default ;
8 void add ( int key ) ;
9 ˜ Tree () ;
10
11 private :
12 Node * root { nullptr };
13 int height ( Node * node ) ;
14 int balance ( Node * node ) ;
15 Node * rightRotation ( Node * p ) ;
16 Node * leftRotation ( Node * p ) ;
17 Node * add ( Node *p , int key ) ;
18 Node * fixup_node ( Node *p , int key ) ;
19 };
20
21 # endif
39
Determinando fator de balanceamento de um nó
40
Determinando fator de balanceamento de um nó
40
Determinando fator de balanceamento de um nó
40
Rotação Direita
p u
u p
Right(p)
T3 T1
T1 T2 T2 T3
41
Rotação Direita
p u
u p
Right(p)
T3 T1
T1 T2 T2 T3
41
Rotação Esquerda
p u
u p
Left(p)
T1 T3
T2 T3 T1 T2
42
Rotação Esquerda
p u
u p
Left(p)
T1 T3
T2 T3 T1 T2
42
Inserção
Função pública:
43
Inserção
Função privada:
44
Inserção
Função privada:
44
Inserção
Função privada:
44
Inserção
Função privada:
44
Inserção
1 Node * Tree :: fixup_node ( Node *p , int key ) {
2 // atualiza altura deste node ancestral p
3 p - > height = 1 + max ( height (p - > left ) , height (p - > right ) ) ;
45
Inserção
1 Node * Tree :: fixup_node ( Node *p , int key ) {
2 // atualiza altura deste node ancestral p
3 p - > height = 1 + max ( height (p - > left ) , height (p - > right ) ) ;
4 // obtem balanco de p
5 int bal = balance ( p ) ;
45
Inserção
1 Node * Tree :: fixup_node ( Node *p , int key ) {
2 // atualiza altura deste node ancestral p
3 p - > height = 1 + max ( height (p - > left ) , height (p - > right ) ) ;
4 // obtem balanco de p
5 int bal = balance ( p ) ;
6 // Caso 1( a ) : rotacao direita
7 if ( bal < -1 && key < p - > left - > key )
8 return rightRotation ( p ) ;
45
Inserção
1 Node * Tree :: fixup_node ( Node *p , int key ) {
2 // atualiza altura deste node ancestral p
3 p - > height = 1 + max ( height (p - > left ) , height (p - > right ) ) ;
4 // obtem balanco de p
5 int bal = balance ( p ) ;
6 // Caso 1( a ) : rotacao direita
7 if ( bal < -1 && key < p - > left - > key )
8 return rightRotation ( p ) ;
9 // Caso 1( b ) : rotacao dupla direita
10 else if ( bal < -1 && key > p - > left - > key ) {
11 p - > left = leftRotation (p - > left ) ;
12 return rightRotation ( p ) ;
13 }
45
Inserção
1 Node * Tree :: fixup_node ( Node *p , int key ) {
2 // atualiza altura deste node ancestral p
3 p - > height = 1 + max ( height (p - > left ) , height (p - > right ) ) ;
4 // obtem balanco de p
5 int bal = balance ( p ) ;
6 // Caso 1( a ) : rotacao direita
7 if ( bal < -1 && key < p - > left - > key )
8 return rightRotation ( p ) ;
9 // Caso 1( b ) : rotacao dupla direita
10 else if ( bal < -1 && key > p - > left - > key ) {
11 p - > left = leftRotation (p - > left ) ;
12 return rightRotation ( p ) ;
13 }
14 // Caso 2( a ) : rotacao esquerda
15 else if ( bal > 1 && key > p - > right - > key )
16 return leftRotation ( p ) ;
45
Inserção
1 Node * Tree :: fixup_node ( Node *p , int key ) {
2 // atualiza altura deste node ancestral p
3 p - > height = 1 + max ( height (p - > left ) , height (p - > right ) ) ;
4 // obtem balanco de p
5 int bal = balance ( p ) ;
6 // Caso 1( a ) : rotacao direita
7 if ( bal < -1 && key < p - > left - > key )
8 return rightRotation ( p ) ;
9 // Caso 1( b ) : rotacao dupla direita
10 else if ( bal < -1 && key > p - > left - > key ) {
11 p - > left = leftRotation (p - > left ) ;
12 return rightRotation ( p ) ;
13 }
14 // Caso 2( a ) : rotacao esquerda
15 else if ( bal > 1 && key > p - > right - > key )
16 return leftRotation ( p ) ;
17 // Caso 2( b ) : rotacao dupla esquerda
18 else if ( bal > 1 && key < p - > right - > key ) {
19 p - > right = rightRotation (p - > right ) ;
20 return leftRotation ( p ) ;
21 }
45
Inserção
1 Node * Tree :: fixup_node ( Node *p , int key ) {
2 // atualiza altura deste node ancestral p
3 p - > height = 1 + max ( height (p - > left ) , height (p - > right ) ) ;
4 // obtem balanco de p
5 int bal = balance ( p ) ;
6 // Caso 1( a ) : rotacao direita
7 if ( bal < -1 && key < p - > left - > key )
8 return rightRotation ( p ) ;
9 // Caso 1( b ) : rotacao dupla direita
10 else if ( bal < -1 && key > p - > left - > key ) {
11 p - > left = leftRotation (p - > left ) ;
12 return rightRotation ( p ) ;
13 }
14 // Caso 2( a ) : rotacao esquerda
15 else if ( bal > 1 && key > p - > right - > key )
16 return leftRotation ( p ) ;
17 // Caso 2( b ) : rotacao dupla esquerda
18 else if ( bal > 1 && key < p - > right - > key ) {
19 p - > right = rightRotation (p - > right ) ;
20 return leftRotation ( p ) ;
21 }
22 return p ;
23 }
45
Remoção
46
Remoção em árvores AVL
47
Algoritmo de remoção em árvores AVL
1. Fazemos uma busca pelo nó a ser removido.
48
Algoritmo de remoção em árvores AVL
1. Fazemos uma busca pelo nó a ser removido.
2. Se o nó encontrado for nulo, então a árvore é vazia ou a chave não existe
na árvore. Não há o que remover neste caso.
48
Algoritmo de remoção em árvores AVL
1. Fazemos uma busca pelo nó a ser removido.
2. Se o nó encontrado for nulo, então a árvore é vazia ou a chave não existe
na árvore. Não há o que remover neste caso.
48
Algoritmo de remoção em árvores AVL
1. Fazemos uma busca pelo nó a ser removido.
2. Se o nó encontrado for nulo, então a árvore é vazia ou a chave não existe
na árvore. Não há o que remover neste caso.
48
Algoritmo de remoção em árvores AVL
1. Fazemos uma busca pelo nó a ser removido.
2. Se o nó encontrado for nulo, então a árvore é vazia ou a chave não existe
na árvore. Não há o que remover neste caso.
48
Algoritmo de remoção em árvores AVL
1. Fazemos uma busca pelo nó a ser removido.
2. Se o nó encontrado for nulo, então a árvore é vazia ou a chave não existe
na árvore. Não há o que remover neste caso.
48
Algoritmo de remoção em árvores AVL
1. Fazemos uma busca pelo nó a ser removido.
2. Se o nó encontrado for nulo, então a árvore é vazia ou a chave não existe
na árvore. Não há o que remover neste caso.
48
Análise do balanceamento na remoção
• Os únicos nós que podem ter se tornado desregulados após a remoção são
os ancestrais do nó fisicamente removido.
49
Análise do balanceamento na remoção
• Os únicos nós que podem ter se tornado desregulados após a remoção são
os ancestrais do nó fisicamente removido.
49
Análise do balanceamento na remoção
50
Análise do balanceamento na remoção
A altura diminui.
Nenhuma regulagem é necessária aqui. Porém, algum ancestral de p pode
ter se tornado desregulado.
51
Análise do balanceamento na remoção
52
Análise do balanceamento na remoção
Caso 3(a): Filho direito de p tem balanço = 0.
Antes da remoção de x, balanço(p) = +1 e, após, balanço(p) = +2.
53
Análise do balanceamento na remoção
Caso 3(b): Filho direito de p tem balanço = +1.
Antes da remoção de x, balanço(p) = +1 e, após, balanço(p) = +2.
54
Análise do balanceamento na remoção
Caso 3(c): Filho direito de p tem balanço = −1.
Antes da remoção de x, balanço(p) = +1 e, após, balanço(p) = +2.
55
Remoção — Exercı́cio 1
Excluir o nó 28 e fazer as regulagens para manter a árvore AVL.
57
21 88
13 28 70 90
16 65 73 92
64
56
Remoção — Exercı́cio 2
Excluir a chave 61 e, depois, a chave 10 da árvore abaixo e fazer as
regulagens necessárias.
50
21 83
10 27 61 95
7 14 24 55 70 90 99
5 53 57 71 97
52 54 56 58
57
Remoção — Função Pública
58
Remoção – Função privada que busca o nó
1 Node * avl_tree :: remove ( Node * node , int key ) {
2 if ( node == nullptr ) // node nao encontrado
3 return nullptr ;
59
Remoção – Função privada que busca o nó
1 Node * avl_tree :: remove ( Node * node , int key ) {
2 if ( node == nullptr ) // node nao encontrado
3 return nullptr ;
4 if ( key < node - > key )
5 node - > left = remove ( node - > left , key ) ;
6 else if ( key > node - > key )
7 node - > right = remove ( node - > right , key ) ;
59
Remoção – Função privada que busca o nó
1 Node * avl_tree :: remove ( Node * node , int key ) {
2 if ( node == nullptr ) // node nao encontrado
3 return nullptr ;
4 if ( key < node - > key )
5 node - > left = remove ( node - > left , key ) ;
6 else if ( key > node - > key )
7 node - > right = remove ( node - > right , key ) ;
8 // encontramos no node
9 else if ( node - > right == nullptr ) { // sem filho direito
10 Node * child = node - > left ;
11 delete node ;
12 return child ;
13 }
14 else // tem filho direito : troca pelo sucessor
15 node - > right = r e m ov e _ s u c c e s s o r ( node , node - > right ) ;
59
Remoção – Função privada que busca o nó
1 Node * avl_tree :: remove ( Node * node , int key ) {
2 if ( node == nullptr ) // node nao encontrado
3 return nullptr ;
4 if ( key < node - > key )
5 node - > left = remove ( node - > left , key ) ;
6 else if ( key > node - > key )
7 node - > right = remove ( node - > right , key ) ;
8 // encontramos no node
9 else if ( node - > right == nullptr ) { // sem filho direito
10 Node * child = node - > left ;
11 delete node ;
12 return child ;
13 }
14 else // tem filho direito : troca pelo sucessor
15 node - > right = r e m ov e _ s u c c e s s o r ( node , node - > right ) ;
16
17 // Atualiza a altura do node e regula o node
18 node = fix up_delet ion ( node ) ;
19 return node ;
20 }
59
Remoção
Função privada que remove o sucessor
60
Remoção — Função privada de rebalanceamento
1 Node * avl_tree :: fixup_d eletion ( Node * node ) {
2 node - > height =
3 1 + max ( height ( node - > left ) , height ( node - > right ) ) ;
4
5 int bal = balance ( node ) ;
6
7 // node pode estar desregulado , ha 4 casos a considerar
8 if ( bal > 1 && balance ( node - > right ) >= 0) {
9 return leftRotation ( node ) ;
10 }
11 else if ( bal > 1 && balance ( node - > right ) < 0) {
12 node - > right = rightRotation ( node - > right ) ;
13 return leftRotation ( node ) ;
14 }
15 else if ( bal < -1 && balance ( node - > left ) <= 0) {
16 return rightRotation ( node ) ;
17 }
18 else if ( bal < -1 && balance ( node - > left ) > 0) {
19 node - > left = leftRotation ( node - > left ) ;
20 return rightRotation ( node ) ;
21 }
22 return node ;
23 }
61
FIM
62