View
220
Download
0
Category
Preview:
Citation preview
IAED, 2014/2015
Árvores AVL
IAED, 2014/2015 2
Resumo da aula de hoje
• Recapitular algumas ideias da última aula – Pesquisa, inserção, remoção & travessias em árvores binárias
de pesquisa.
• Árvores binárias equilibradas – Exemplo: Rotações, pesquisa, inserção e remoção em
AVL trees
• Exercícios
IAED, 2014/2015 3
Estrutura de uma Árvore Binária
#include "Item.h" typedef struct node { Item item; struct node *l; struct node *r; } *link;
r
r r
l
l l
IAED, 2014/2015 4
Árvores de Procura Binárias (BST)
• Nós na sub-árvore esquerda tem chaves menores ou iguais que a raíz
• Nós na sub-árvore direita tem chaves maiores ou iguais que a raíz
20
12 32
8 18 23 45
2 9
IAED, 2014/2015 5
Árvores de Procura Binárias (BST)
• Vamos procurar o 2 • No pior caso, a pesquisa escala com a profundidade da
árvore.
20
12 32
8 18 23 45
2 9
IAED, 2014/2015 6
Inserção de um novo elemento
• Vamos inserir o elemento “9”
20
12 32
8 18 23 45
2 9
IAED, 2014/2015
• Mais difícil: 3 possibilidades. 1. 2. 3.
Remoção de um elemento
7
5
45
20
22
IAED, 2014/2015
1. Se o nó não tiver filhos à fácil... Basta apagar.
2. Se o nó tiver um só filho... Também é fácil.
3. Remoção de um nó interno: 1. substituímos o elemento a remover pelo maior dos elementos à
esquerda do elemento a ser removido. 2. removemos esse elemento (que estará necessariamente nas
condições 1 ou 2)
12
Exemplos: Remoção de um elemento
IAED, 2014/2015 13
Travessia em Pre-Order
• Visita raíz antes dos filhos: Output: 20, 12, 8, 2, 9, 18, 32, 23, 45
void traverse(link h) { if (h == NULL) return; visit(h->item); traverse(h->l); traverse(h->r); }
20
12 32
8 18 23 45
2 9
IAED, 2014/2015 14
Travessia em In-Order (sorted!!)
• Visita a raíz depois de visitar o filho esquerdo e antes de visitar o direito
Output: 2, 8, 9, 12, 18, 20, 23, 32, 45 void traverse(link h) { if (h == NULL) return; traverse(h->l); visit(h); traverse(h->r); }
20
12 32
8 18 23 45
2 9
IAED, 2014/2015 15
Travessia em Post-Order
• Apenas visita a raíz depois de visitar o filho direito e o esquerdo
• Output: 2, 9, 8, 18, 12, 23, 45, 32, 20 • Exemplo de aplicação: avaliação de expressões posfixadas void traverse(link h) { if (h == NULL) return; traverse(h->l); traverse(h->r); visit(h); }
20
12 32
8 18 23 45
2 9
IAED, 2014/2015 16
Pesquisas em BST
• Geralmente eficiente: • No pior caso, para uma árvore desequilibrada
– Ordem de inserção: 1,2,3,4,5,6,7,8
• No caso de chaves aleatórias,
• Comparação com pesquisa binária em tabelas: – Tempo de pesquisa comparável – Tempo de inserção muito mais rápido
(log )O N( )O N
(log )O N
( )O N
IAED, 2014/2015 17
Árvores Binárias Equilibradas
• Evitam o pior caso de • Algum overhead na construção • Alternativa:
– Reequilibrar uma árvore, depois de construída – Usar aleatoriedade – Usar técnicas especiais de construção
(AVL, Red-Black, etc)
( )O N
E
F
B
D
A
C
0
1
2
3
4
5
IAED, 2014/2015 18
Árvores AVL (Adelson-Velskii e Landis)
• BST em que, para cada nó interno, a profundidade (height) de ambos os filhos difere, no máximo, em 1
20
12 32
8 18 23 45
2 9 0
1
2
0 0 0
1
3
0
Nota: Estamos a considerar que a profundidade de uma folha = 0
Height
IAED, 2014/2015 19
Árvores AVL (Adelson-Velskii e Landis)
• Será que esta árvore esta “equilibrada”?
20
12 32
8 18 23 45
2 9 0
1
2
0 0 0
1
3
0
IAED, 2014/2015 21
Inserção em Árvores AVL
• Inserção de um elemento pode desequilibrar a árvore
20
12 32
8 18 23 45
2 9 0
1
2
0 0 0
1
3
0
IAED, 2014/2015 22
Inserção em Árvores AVL
• Inserção de um elemento pode desequilibrar a árvore Vamos inserir o “1”!
20
12 32
8 18 23 45
2 9 0
1
2
0 0 0
1
3
0
Height
IAED, 2014/2015 23
Inserção em Árvores AVL
• Inserção de um elemento pode desequilibrar a árvore
20
12 32
8 18 23 45
2 9 1
2
3
0 0 0
1
4
0
1 0
Height
IAED, 2014/2015 24
Inserção em Árvores AVL
• Inserção de um elemento pode desequilibrar a árvore
20
12 32
8 18 23 45
2 9 1
2
3
0 0 0
1
4
0
1 0
árvore desequilibrada !
Height
IAED, 2014/2015 25
Inserção em Árvores AVL
• Pode ser necessário equilibrar após a inserção
árvore desequilibrada !
Height 20
12 32
8 18 23 45
2 9 1
2
3
0 0 0
1
4
0
1 0
IAED, 2014/2015 26
Inserção em Árvores AVL
20
8
23 2 12 1
2
3
0
32
45
0 0
0
1
1
1 0
árvore equilibrada !
9 18
Height
20
12 32
8 18 23 45
2 9
1
IAED, 2014/2015 27
Inserção em Árvores AVL
• Em vez da altura (height) podemos analisar directamente o balance factor = height (left) – height (right)
20
8
23 2 12 1
2
3
0
32
45
0 0
0
1
1
1 0
árvore equilibrada !
9 18
Height
IAED, 2014/2015 28
Inserção em Árvores AVL
• Em vez da altura (height) podemos analisar directamente o balance factor = height (left) – height (right)
20
8
23 2 12 1
0
1
0
32
45
0 0
0
0
0
1 0
árvore equilibrada !
9 18
Balance factor
IAED, 2014/2015 29
Operações de Rotação - Esquerda
link rotL(link h) { link x = h->r; h->r = x->l; x->l = h; return x; }
F
D H
B E G I
A C
F
D
H
B E
G
I
A C
x
h h
x
IAED, 2014/2015 30
Operações de Rotação - Direita
link rotR(link h) { link x = h->l; h->l = x->r; x->r = h; return x; }
D
B H
A C F I
E G
D
B
H A C
F
I
E
G
x
h x
h
IAED, 2014/2015 31
Inserção em Árvores AVL
• Inserir novo elemento, numa folha, como numa BST normal
• Percorrer o caminho desde a nova folha até à raíz – Para cada nó encontrado, verificar se as alturas dos dois filhos
(esquerdo e direito) não diferem em mais do que 1 – Se diferirem, equilibrar a sub-árvore com raíz nesse nó,
efectuando uma rotação (simples ou dupla)
• Após equilibrar a sub-árvore com raíz num determinado nó x, não será necessário equilibrar as sub-árvores com raíz nos antepassados de x – Terminar após uma equilibragem, ou quando atingirmos a raíz
IAED, 2014/2015 32
Equilibragem de Árvores AVL
• Rotação Simples I (left)
A B
C A
B C
rotação esquerda
IAED, 2014/2015 33
Equilibragem de Árvores AVL
• Rotação Simples II (right)
C B
A A
B C
rotação direita
IAED, 2014/2015 34
AVL Ex. 1: Inserção com rotações simples
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 18
45
36 63
27 39 72 54 0 0
0
0 0
0
0
Balance factor
IAED, 2014/2015 35
AVL Ex. 1: Inserção com rotações simples
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 18 • Esta BST está equilibrada?
45
36 63
27 39 72 54 0 1
1
0 0
0
1
18 0
Balance factor
IAED, 2014/2015 36
AVL Ex. 1: Inserção com rotações simples
• Agora vamos introduzir o elemento 9... Está equilibrada? • NÃO!!!! • Vamos subir do 9 em direção à raiz até encontrar um elemento
desequilibrado. 45
36 63
27 39 72 54 0 2
2
0 0
0
2
18 1
9 0
Balance factor
IAED, 2014/2015 37
AVL Ex. 1: Inserção com rotações simples
• Para equilibrar, basta fazer uma rotação simples para a direita (rotR) aplicada ao elemento 27
45
36 63
27 39 72 54 0 2
2
0 0
0
2
18 1
9 0
IAED, 2014/2015
AVL Ex. 1: Inserção com rotações simples
• Para equilibrar, basta fazer uma rotação simples para a direita (rotR) aplicada ao elemento 27
• ...e já está!!!
45
36 63
18 39 72 54 0 0
1
0 0
0
1
9 0
27 0
IAED, 2014/2015 39
AVL Ex. 1: Inserção com rotações simples
45
36 63
27 39 72 54 0 2
2
0 0
0
2
18 1
9 0
RECEITA 1: Quando o novo nó é inserido na sub-árvore da esquerda, da sub-árvore da esquerda do elemento desequilibrado, basta-nos aplicar uma rotR a esse elemento.
IAED, 2014/2015 40
AVL Ex. 2: Inserção com rotações simples
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 91
45
36 63
27 39 72 54 0 0
0
0 -1
-1
-1
89 0
IAED, 2014/2015 41
AVL Ex. 2: Inserção com rotações simples
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 91
45
36 63
27 39 72 54 0 0
0
0 -2
-2
-2
89 -1
91 0
IAED, 2014/2015 42
AVL Ex. 2: Inserção com rotações simples
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 91
45
36 63
27 39 72 54 0 0
0
0 -2
-2
-2
89 -1
91 0
RECEITA 2: Quando o novo nó é inserido na sub-árvore da direita, da sub-árvore da direita, do elemento desequilibrado, basta-nos aplicar uma rotL a esse elemento.
IAED, 2014/2015 43
AVL Ex. 2: Inserção com rotações simples
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• RESULTADO FINAL: 45
36 63
27 39 89 54 0 0
0
0 0
-1
-1
91 0
72 0
IAED, 2014/2015 44
AVL Ex. 3: Inserção com rotações duplas
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 56
45
36 63 0
0
1
-1
50
IAED, 2014/2015 45
AVL Ex. 3: Inserção com rotações duplas
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 56
45
36 63
50
0
-1
2
-2
56 0
Receita 3: O novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado!! O que fazer ? Rotação dupla Esquerda-Direita
IAED, 2014/2015 46
Equilibragem de Árvores AVL
• Rotação Dupla I
A B
C
rotação esquerda
B A
C
Esquerda-Direita
IAED, 2014/2015 47
Equilibragem de Árvores AVL
• Rotação Dupla I (cont)
rotação esquerda, direita
A B
C A
B C
Esquerda-Direita
IAED, 2014/2015 48
Equilibragem de Árvores AVL
• Rotação Dupla II
C B
B C
A
rotação direita
A
Direita-Esquerda
IAED, 2014/2015 49
Equilibragem de Árvores AVL
• Rotação Dupla II (cont)
C B
A B
C A
rotação direita, esquerda
Direita-Esquerda
IAED, 2014/2015 50
AVL Ex. 3: Inserção com rotações duplas
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 56
45
36 63
50
0
-1
2
-2
56 0
Receita 3: O novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado!! O que fazer ? Rotação dupla Esquerda-Direita rotL
IAED, 2014/2015 51
AVL Ex. 3: Inserção com rotações duplas
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 56
45
36 63 0
1
2
-2
50
rotL 56
0
Receita 3: O novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado!! O que fazer ? Rotação dupla Esquerda-Direita
IAED, 2014/2015 52
AVL Ex. 3: Inserção com rotações duplas
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 56
45
36 63 0
1
2
-2
50
rotR
56
0
Receita 3: O novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado!! O que fazer ? Rotação dupla Esquerda-Direita
IAED, 2014/2015
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 56
63 0
53
AVL Ex. 3: Inserção com rotações duplas
45
36 56 0
0
0
-1
rotR
50
Receita 3: O novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado!! O que fazer ? Rotação dupla Esquerda-Direita
IAED, 2014/2015
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos inserir o elemento 56
• RESULTADO FINAL:
63 0
54
AVL Ex. 3: Inserção com rotações duplas
45
36 56 0
0
0
-1
50
IAED, 2014/2015 55
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Depois de inserir o elemento 65 temos:
AVL Ex. 4: Inserção com rotações duplas
45
36 63 0
-1
70 0
1
IAED, 2014/2015
65 0
56
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Depois de inserir o elemento 65 temos:
AVL Ex. 4: Inserção com rotações duplas
45
36 63 0 -2
-2
70 1
rotR Receita 4: O novo nó é inserido na sub-árvore da esquerda, da sub-árvore da direita do elemento desequilibrado!! O que fazer ? Rotação dupla Direita-Esquerda
IAED, 2014/2015 57
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Depois de inserir o elemento 65 temos:
AVL Ex. 4: Inserção com rotações duplas
45
36 63 0 -2
-2
65
70
-1
Receita 4: O novo nó é inserido na sub-árvore da esquerda, da sub-árvore da direita do elemento desequilibrado!! O que fazer ? Rotação dupla Direita-Esquerda
rotR
IAED, 2014/2015 58
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Depois de inserir o elemento 65 temos:
AVL Ex. 4: Inserção com rotações duplas
45
36 63 0 -2
-2
65
70
-1
rotL
Receita 4: O novo nó é inserido na sub-árvore da esquerda, da sub-árvore da direita do elemento desequilibrado!! O que fazer ? Rotação dupla Direita-Esquerda
IAED, 2014/2015 59
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Depois de inserir o elemento 65 temos :
AVL Ex. 4: Inserção com rotações duplas
45
36 65 0 0
-1
70 63 0 0
Receita 4: O novo nó é inserido na sub-árvore da esquerda, da sub-árvore da direita do elemento desequilibrado!! O que fazer ? Rotação dupla Direita-Esquerda
rotL
IAED, 2014/2015 60
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Depois de inserir o elemento 65 temos (resultado final):
AVL Ex. 4: Inserção com rotações duplas
45
36 65 0 0
-1
70 63 0 0
IAED, 2014/2015 61
Resumo
Caso 4: Se o novo nó é inserido na sub-árvore da esquerda, da sub-árvore da direita do elemento desequilibrado, fazemos uma rotação dupla Direita-Esquerda
Caso 3: Se o novo nó é inserido na sub-árvore da direita, da sub-árvore da esquerda do elemento desequilibrado, fazemos uma rotação dupla Esquerda-Direita
Caso 2: Se o novo nó é inserido na sub-árvore da direita, da sub-árvore da direita do elemento desequilibrado, basta-nos aplicar uma rotação simples para a esquerda aplicada a esse elemento.
Caso 1: Se o novo nó é inserido na sub-árvore da esquerda, da sub-árvore da esquerda do elemento desequilibrado, basta-nos aplicar uma rotação simples para a direita aplicada a esse elemento.
IAED, 2014/2015 62
Remoção em Árvores AVL
• Remoção de um elemento pode desequilibrar a árvore
20
12 32
8 18 45
2 9 0
0
1
0 0
-1
1
0
Balance factor
IAED, 2014/2015
0
63
Remoção em Árvores AVL
• Remoção de um elemento pode desequilibrar a árvore
20
12 32
8 18
2 9 0
0
1
0
2
0
árvore desequilibrada !
IAED, 2014/2015 64
Remoção em Árvores AVL
• Remover um nó como numa BST normal • Percorrer o caminho desde o nó removido até à raíz
– Para cada nó encontrado, verificar se as alturas dos dois filhos (esquerdo e direito) não diferem em mais do que 1
– Se diferirem, equilibrar a sub-árvore com raíz nesse nó, efectuando uma rotação simples ou uma rotação dupla
• Após equilibrar a sub-árvore com raíz num determinado nó x, poderá ser necessário equilibrar as sub-árvores com raízes nos antepassados de x – Terminar apenas quando atingirmos a raíz
IAED, 2014/2015 65
AVL Ex. 5: Remoção de nós
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos remover o elemento 72:
45
36 63
27 72 1
0
-1 0
-1
1
40 0
18 0
39
IAED, 2014/2015 66
AVL Ex. 5: Remoção de nós
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos remover o elemento 72:
45
36 63
27 1
0
-1
0
2
40 0
18 0
rotR
39
IAED, 2014/2015 67
AVL Ex. 5: Remoção de nós
• Considere a árvore em baixo. Os números ao lado correspondem ao balance factor = height (left) – height (right)
• Vamos remover o elemento 72:
36
27
18 0
1 1
-1
40 0
63 0
39
45
1
IAED, 2014/2015 68
Pesquisa em Árvores AVL
• Pesquisa é realizada como numa árvore BST normal
• Pesquisa não altera a árvore
IAED, 2014/2015 69
Desempenho de Árvores AVL
• Uma equilibragem (rotação dupla ou simples):
• Pesquisa: O (log N) – Profundidade é , não é necessário equilibrar
• Inserção: O (log N) – Procurar a posição para inserir é O (log N) – Manter equilibrada é O (log N) : subir na árvore e equilibrar 1 vez
• Remoção: O (log N) – Procurar o elemento a remover é O (log N) – Manter equilibrada é O (log N) : subir na árvore e equilibrar no
máximo O (log N) vezes
(1)O
(log )O N
IAED, 2014/2015 70
Exercício 1
Construa uma árvore AVL inserindo os seguintes elementos (por esta ordem):
63, 9, 19, 27, 18, 108, 99 e 81 Desenhe a árvore equilibrada resultante, e escreva o resultado de uma travessia pre-order sobre essa árvore.
IAED, 2014/2015 71
Exercício 1
63
9
19
19
9 RotL(9) + RotR(63)
à
27 18 108
99
81
<-RotR
63
63, 9, 19, 27, 18, 108, 99 e 81
IAED, 2014/2015 72
Exercício 1
108
19
9
27 18 99
81
Travessia pre-order: 19, 9, 18, 63, 27, 99, 81, 108
0 0
0 0
0
-1 -1
-1 Balance factors
63
IAED, 2014/2015 73
Exercício 2
108
19
9
27 18 99
81
Vamos agora remover o elemento 18 !!
0 0
0 0
0
-1 -1
-1 Balance factors
63
IAED, 2014/2015 74
Exercício 2
108
19
9
27 99
81
Vamos agora remover o elemento 18 !!
0
0 0
0
-1 0
-2 nó desequilibrado!
63
IAED, 2014/2015 75
Exercício 2
108
19
9
27 99
81
O que fazer?
0
0 0
0
-1 0
-2 nó desequilibrado!
63
IAED, 2014/2015 76
Exercício 2
108
19
9
27 99
81
O que fazer? Rodar o elemento desequilibrado para a esquerda...
0
0 0
0
-1 0
-2 nó desequilibrado!
63
IAED, 2014/2015 77
Exercício 2
63
19
81 108
Já está!
0 0
0 0
0
99
9 27
IAED, 2014/2015
78
ADTs + AVLs: Alterações ao código anterior
#ifndef _ST_ #define _ST_ #include <stdlib.h> #include <stdio.h> #include "Item.h" typedef struct STnode* link; void STinit(link*); int STcount(link); Item STsearch(link,Key); void STinsert(link*,Item); void STdelete(link*,Key); void STsort(link,void (*visit)(Item)); void STfree(link*); #endif
ST.h
IAED, 2014/2015
79
#include "ST.h” struct STnode { Item item; link l, r; int height}; link NEW(Item item, link l, link r) { link x = (link)malloc(sizeof(struct STnode)); x->item = item; x->l = l; x->r = r; x->height=1;
return x; } int height(link h){ if (h == NULL) return 0; return h->height; }
ST.c (alterações a verde)
Height vai guardando a altura do nó
IAED, 2014/2015
80
link rotL(link h) { int height_left, height_right;
link x = h->r; h->r = x->l; x->l = h; height_left = height(h->l);
height_right = height(h->r);
h->height = height_left > height_right ? height_left + 1 : height_right + 1;
height_left = height(x->l);
height_right = height(x->r); x->height =
height_left > height_right ? height_left + 1 : height_right + 1; return x; }
ST.c (alterações a verde)
Actualizar a altura dos nós
envolvidos
IAED, 2014/2015
81
link rotR(link h) { int height_left, height_right;
link x = h->l; h->l = x->r; x->r = h; height_left = height(h->l);
height_right = height(h->r);
h->height = height_left > height_right ? height_left + 1 : height_right + 1;
height_left = height(x->l);
height_right = height(x->r); x->height =
height_left > height_right ? height_left + 1 : height_right + 1; return x; }
ST.c (alterações a verde)
Actualizar a altura dos nós
envolvidos
IAED, 2014/2015
82
link rotLR(link h) /*rotação dupla esquerda direita*/ {
if (h==NULL) return h; h->l = rotL(h->l); return rotR(h); } link rotRL(link h) /*rotação dupla direita esquerda*/
{ if (h==NULL) return h; h->r = rotR(h->r); return rotL(h); }
int Balance(link h) {/*Balance factor*/ if(h == NULL) return 0; return height(h->l) - height(h->r); }
ST.c (alterações a verde)
IAED, 2014/2015
83
link AVLbalance(link h) { int balanceFactor; if (h==NULL) return h;
balanceFactor= Balance(h); if(balanceFactor>1) { if (Balance(h->l)>0) h=rotR(h); else h=rotLR(h); }
else if(balanceFactor<-1){ if (Balance(h->r)<0) h = rotL(h); else h = rotRL(h); } else{
int height_left = height(h->l);
int height_right = height(h->r); h->height = height_left > height_right ? height_left + 1 : height_right + 1;
} return h; }
ST.c (alterações a verde)
IAED, 2014/2015
84
link insertR(link h, Item item) { if (h == NULL) return NEW(item, NULL, NULL); if (less(key(item), key(h->item))) h->l = insertR(h->l, item); else h->r = insertR(h->r, item); h = AVLbalance(h); return h; }
ST.c (alterações a verde)
IAED, 2014/2015
85
link deleteR(link h, Key k) { if (h == NULL) return h; else if (less(k, key(h->item))) h->l = deleteR(h->l,k);
else if (less(key(h->item), k)) h->r = deleteR(h->r,k) ; else{ if (h->l !=NULL && h->r !=NULL){ link aux = max(h->l); {Item x; x = h->item; h->item = aux->item; aux->item = x;} h->l = deleteR(h->l, key(aux->item));
} else { link aux = h; if (h->l == NULL && h->r == NULL) h=NULL; else if (h->l == NULL) h = h->r; else h = h->l;
deleteItem(aux->item); free(aux); } }
h = AVLbalance(h); return h; }
ST.c (alterações a verde)
Recommended