Title:
1Árvores de Busca
2Árvores de Busca
- Uma árvore que suporta eficientes operações de
busca, inclusão e exclusão é chamada de árvore de
busca. A árvore é usada para armazenar um
conjunto finito de chaves obtidas de um conjunto
totalmente ordenado de chaves K. Cada nó da
árvore contém um ou mais chaves e todas as chaves
na árvore são únicas, sem duplicação. - A diferença entre uma árvore comum e uma árvore
de busca é que, nesta última, as chaves não
aparecem em nós arbitrários. Existe um critério
de ordenação de dados que determina aonde cada
chave pode figurar na árvore em relação às
demais. - Serão apresentadas as árvores de busca
- de M caminhos (M-Way)
- binárias.
3Binary Search Tree (BST)
- Definição (Árvore de busca M-way)
- Uma árvore de busca M-way T é um conjunto finito
de chaves. Ou o conjunto é vazio, T ? ou o
conjunto é constituído de n sub árvores M-way T1
, T2 ,..., Tn-1, - e n-1 chaves, k1 , k2 ,..., kn-1,
- T T0,k1, T1, k2, ..., kn-1, Tn-1
- aonde 2 ? n ? M, tal que as chaves e
os nós satisfaçam às seguintes propriedades de
ordenação de dados - As chaves em cada nó são distintas e ordenadas,
i.e., kiltki1 - para 1 ? i ? n-1
- Todas as chaves contidas na sub árvore Ti-1 são
menores do que ki. A árvore Ti-1 é chamada sub
árvore da esquerda com respeito à chave ki. - Todas as chaves contidas na sub árvore Ti são
maiores do que ki. A árvore Ti1 é chamada sub
árvore da direita com respeito à chave ki.
4Exemplo de árvore de busca M-Way
5Binary Search Tree (BST)
- Definição (Árvore Binária de Busca)
- A Árvore Binária de Busca T é um conjunto
finito de chaves. Ou o conjunto é vazio, T ?
ou o conjunto consiste da raiz r e exatamente
duas Árvores Binárias de Busca TL e TR ,
Tr,TL,TR, tais que as seguintes propriedades
sejam satisfeitas - Todas as chaves contidas na sub árvore da
esquerda, TL, são menores do que r. - Todas as chaves contidas na sub árvore da
direita, TR , são maiores do que r.
6Exemplo de árvore binária de busca
7Busca em Árvores de Busca M-Way
- Busca do objeto x inicia na raiz
- Se a raiz estiver vazia a busca falha
- As chaves contidas na raiz são examinadas para
verificar se o objeto buscado está presente - Se o objeto não estiver presente três casos podem
ocorrer - Objeto buscado é menor do que k1
- a busca prossegue em T0
- Objeto buscado é maior do que kn-1
- a busca prossegue em Tn-1
- Existe um i tal que ki lt x lt ki1
- a busca prossegue em Ti
8Busca em Árvores Binárias de Busca
- Semelhante à busca em árvores de busca M-Way
- Apenas cada nó só possui um objeto e duas sub
árvores
9Árvore Binária Perfeita
- Definição (Árvore Binária Perfeita)
- A Árvore Binária Perfeita de altura h? 0 é um
árvore binária Tr,TL,TR com as propriedades - Se h0, então TL ? e TR ? .
- Caso contrário, hgt0, caso no qual ambos TL e TR
são Árvores Binárias Perfeitas de altura h -1.
10Implementação Java
11Implementação de Árvores de Busca
12Interface SearchTree
- // pgm10_01.java
- public interface SearchTree
- extends Tree, SearchableContainer
-
- Comparable findMin ()
- Comparable findMax ()
13Classe BinarySearchTree
- // pgm10_02.java
- public class BinarySearchTree
- extends BinaryTree
- implements SearchTree
-
- // ...
14Classe Association
- public class Association
- extends AbstractObject
-
- protected Comparable key
- protected Object value
- // ...
-
- // só aparece por causa de getKey
15Métodos da Classe Association
- public class Association
- extends AbstractObject
-
- protected Comparable key
- protected Object value
- public Association (Comparable key, Object
value) -
- this.key key
- this.value value
-
- public Association (Comparable key)
- this (key, null)
- public Comparable getKey ()
- return key
- public Object getValue ()
- return value
- // ...
16Métodos da Classe BinarySearchTree
- getLeftBST
- getRightBST
- find
- findMin
- insert
- attachKey
- balance
- withdraw
17Métodos getLeftBST e getRightBST
- // pgm10_03.java
- public class BinarySearchTree
- extends BinaryTree
- implements SearchTree
-
- private BinarySearchTree getLeftBST()
- return (BinarySearchTree) getLeft()
-
- private BinarySearchTree getRightBST()
- return (BinarySearchTree) getRight()
- // ...
18Método find
- // pgm10_04.java
- public class BinarySearchTree
- extends BinaryTree
- implements SearchTree
-
- public Comparable find (Comparable object)
-
- if(isEmpty())
- return null
- int diff object.compare((Comparable)
getKey()) - if(diff 0)
- return (Comparable) getKey()
- else
- if(diff lt 0)
- return getLeftBST().find(object)
- else
- return getRightBST().find(object)
-
19Método findMin
- public Comparable findMin ()
-
- if(isEmpty())
- return null
- else
- if(getLeftBST().isEmpty())
- return (Comparable) getKey()
- else
- return getLeftBST().findMin()
-
- // ...
20Inserção de itens em BST
- A inclusão de nós em árvores de busca deve ser
precedida de uma operação de busca. Esta operação
indica se o nó buscado já existe na árvore e, em
caso de não existência, o local aonde deve ser
feita a inclusão. Convém lembrar que uma busca
sempre termina em folha e os nós a incluir serão
incluídos como filhos da folha aonde se encerrou
a busca.
21Método insert (1)
- // pgm10_05.java
- public class BinarySearchTree
- extends BinaryTree
- implements SearchTree
-
- public void insert (Comparable object)
-
- if(isEmpty())
- attachKey (object)
22Método insert (2)
- else
-
- int diff object.compare((Comparable)
getKey()) - if(diff 0)
- throw new IllegalArgumentException(
- chave duplicada")
- if(diff lt 0)
- getLeftBST().insert(object)
- else
- getRightBST().insert(object)
-
- balance()
-
23Métodos attachKey e balance
- public void attachKey (Object object)
-
- if(!isEmpty())
- throw new InvalidOperationException()
- key object
- left new BinarySearchTree()
- right new BinarySearchTree()
-
- protected void balance()
-
24Remoção de itens em BST
- A exclusão de nós em árvores de busca pode
configurar um de 3 casos. - Se o nó não tiver filhos pode ser excluído sem
exigir ajustamento da árvore. - Se o nó a excluir tiver apenas uma sub árvore,
este nó pode ser excluído e deve ser substituído
por seu filho único. - Se o nó a excluir tiver mais de um filho, para
que ele possa ser excluído, deve ser substituído
por seu antecessor ou seu sucessor em ordem
infixa. O nó substituto deve ser excluído da sua
posição gerando outro processo de exclusão. - Considerando o caso do sucessor em ordem infixa,
o nó a ser excluído deve ser substituído pelo nó
obtido alcançando-se o nó mais à esquerda da sub
árvore direita do nó a excluir.
25Remoção de itens em BST
- Remoção do nó (4) folha em BST
- Remoção do nó (1) não folha em BST
26Método withdraw (1)
- // pgm10_06.java
- public class BinarySearchTree
- extends BinaryTree
- implements SearchTree
-
- public void withdraw (Comparable object)
-
- if(isEmpty())
- throw new IllegalArgumentException(
- "objeto não encontrado")
- int diff object.compare ((Comparable)
getKey()) - if(diff 0)
-
- if(!getLeftBST().isEmpty())
-
- Comparable max getLeftBST().findMax()
- key max
- getLeftBST().withdraw(max)
-
27Método withdraw (2)
- else
- if(!getRightBST().isEmpty())
-
- Comparable min getRightBST().findMin()
- key min
- getRightBST().withdraw(min)
-
- else
- detachKey()
-
- else
- if(diff lt 0)
- getLeftBST().withdraw(object)
- else
- getRightBST().withdraw(object)
- balance()
-
- // ...
28Árvores de Busca AVL
29Conceito de AVL
- Adelson-Velskii e Landis propuseram as condições
de balanceamento para uma árvore binária que
recebeu como sigla suas iniciais. - Definição (Condição de equilíbrio AVL) Uma
árvore binária vazia é AVL balanceada . Uma
árvore binária não-vazia, Tr,TL,TR , é AVL
balanceada se tanto TL quanto TR forem AVL
balanceadas e hL-hRlt1 -
- aonde hL é a altura of TL e hR é a altura of TR .
30Implementação de árvores AVL
31Classe AVLTree
- // pgm10_07.java
- public class AVLTree
- extends BinarySearchTree
-
- protected int Height
- // ...
32Construtor
- // pgm10_08.java
- public class AVLTree
- extends BinarySearchTree
-
- protected int Height
- public AVLTree()
- Height -1
- // ...
33Métodos getHeight, adjustHeight e getBalanceFactor
- public int getHeight ()
- return Height
- protected void adjustHeight()
-
- if(isEmpty())
- Height -1
- else
- Height 1 Math.max(left.getHeight(),
- right.getHeight())
-
- protected int getBalanceFactor()
-
- if(isEmpty())
- return 0
- else
- return left.getHeight() -
right.getHeight() -
34Inserção de itens em Árvores AVL
- 1o. Passo Inserir o item
- 2o. Passo Balancear a árvore
35Balanceamento de Árvores AVL
- O balanceamento de árvores AVL é feito por
operações chamadas de rotações, que podem ser - Rotações simples (LL e RR)
- Rotações duplas (LR e RL)
36Rotações simples
- A rotação LL ocorre quando um nó (B) tem a sub
árvore da esquerda maior do que a da direita e
seu filho da esquerda (A) tem sub árvore da
esquerda maior do que a da direita - A rotação RR ocorre quando um nó (B) tem a sub
árvore da direita maior do que a da esquerda e
seu filho da direita (A) tem sub árvore da
direita maior do que a da esquerda
37Rotações duplas
- A rotação LR ocorre quando um nó (C) tem a sub
árvore da esquerda maior do que a da direita e
seu filho da esquerda (A) tem sub árvore da
direita maior do que a da esquerda. Aplica-se uma
rotação RR a A seguida de uma rotação LL aplicada
a C. - A rotação RL ocorre quando um nó (C) tem a sub
árvore da direita maior do que a da esquerda e
seu filho da direita (A) tem sub árvore da
esquerda maior do que a da direita. Aplica-se uma
rotação LL a A seguida de uma rotação RR aplicada
a C.
38Rotação Simples LL
39Propriedades das rotações simples
- Existem três propriedades importantes da rotação
LL - A rotação não destrói a propriedade de ordenação
de dados e, portanto, o resultado ainda é uma
árvore de busca. A sub árvore AL permanece entre
os nós A e B, e a sub árvore BR fica à direita
do nó B. - Após a rotação tanto A quanto B são AVL
balanceadas. Os nós A e B ficam com fator de
balanceamento igual a zero. - Após a rotação a árvore permanece com a altura
original. A inclusão do item não aumenta a
altura da árvore.
40Rotações Duplas
41Balanceamento de árvores AVL
- Os desbalanceamentos e as rotações de equilíbrio
correspondentes podem ser enquadrados em seis
categorias, ou casos, adiante descritos. O
ancestral mais novo, desbalanceado, do novo nó
inserido é ya. Seu filho na direção do
desbalanceamento é s. Os sufixos l e r
representam filho mais velho e filho mais novo,
respectivamente
42Categorias de rotações
- 1o caso O novo nó é incluído na sub árvore
esquerda da sub árvore esquerda do nó ya. Este
caso tem solução chamada de rightrotation ou
rotação LL - 2o caso O novo nó é incluído na sub árvore
direita da sub árvore direita do nó ya. Este caso
tem solução chamada de leftrotation ou rotação RR - 3 o caso O novo é incluído na sub árvore
esquerda da sub árvore direita do filho mais
velho de ya (rotação LR) - 4 o caso O novo nó é incluído na sub árvore
direita da sub árvore direita do filho mais velho
de ya (LR) - 5 o caso O novo nó é incluído na sub árvore
direita da sub árvore esquerda do filho mais novo
de ya (RL) - 6 o caso O novo nó incluído na sub árvore
esquerda da sub árvore esquerda do filho mais
novo de ya (RL)
43Rotação LL
44Rotação LL
45Rotação RR
46Rotação RR
47Rotação LR
48Rotação LR
49Rotações LR e RL
50Rotação LR
51Rotação RL
52Classe AVLTree
- public class AVLTree
- extends BinarySearchTree
-
- protected int Height
- // ...
53Métodos height, getHeight e getBalanceFactor (1)
- public class AVLTree
- extends BinarySearchTree
-
- protected int height
- public AVLTree()
- height -1
- public int getHeight()
- return height
- protected void adjustHeight()
-
- if(isEmpty())
- height -1
- else
- height 1 Math.max (left.getHeight(),
- right.getHeight())
-
54Métodos height, getHeight e getBalanceFactor (2)
- protected int getBalanceFactor()
-
- if(isEmpty())
- return 0
- else
- return left.getHeight() -
right.getHeight() -
- // ...
55Método doLLRotation (1)
- // pgm10_09.java
- public class AVLTree
- extends BinarySearchTree
-
- protected int Height
- protected void doLLRotation()
-
- if(isEmpty())
- throw new InvalidOperationException()
- BinaryTree tmp right
- right left
- left right.left
- right.left right.right
- right.right tmp
56Método doLLRotation (2)
- Object tmpObj key
- key right.key
- right.key tmpObj
- getRightAVL().adjustHeight()
- adjustHeight()
-
- // ...
57Método doRRRotation (1)
- public class AVLTree
- extends BinarySearchTree
-
- protected int Height
- protected void doRRRotation()
-
- if(isEmpty())
- throw new InvalidOperationException()
- BinaryTree tmp left
- left right
- right left.right
- left.right left.left
- left.left tmp
58Método doRRRotation (2)
- Object tmpObj key
- key left.key
- left.key tmpObj
- getLeftAVL().adjustHeight()
- adjustHeight()
-
- // ...
59Método doLRRotation
- // pgm10_10.java
- public class AVLTree
- extends BinarySearchTree
-
- protected int Height
- protected void doLRRotation()
-
- if(isEmpty())
- throw new InvalidOperationException()
- getLeftAVL().doRRRotation()
- doLLRotation()
-
- // ...
60Método doRLRotation
- public class AVLTree
- extends BinarySearchTree
-
- protected int Height
- protected void doRLRotation()
-
- if(isEmpty())
- throw new InvalidOperationException()
- getRightAVL().doLLRotation()
- doRRRotation()
-
- // ...
61Método balance (1)
- // pgm10_11.java
- public class AVLTree
- extends BinarySearchTree
-
- protected int Height
- protected void balance()
-
- adjustHeight()
- if(getBalanceFactor() gt 1)
-
- if(getLeftAVL().getBalanceFactor() gt 0)
- doLLRotation()
- else
- doLRRotation()
-
62Método balance (2)
- else
- if(getBalanceFactor() lt -1)
-
- if(getRightAVL().getBalanceFactor() lt
0) - doRRRotation()
- else
- doRLRotation()
-
-
- // ...
63Método attachKey
- // pgm10_12.java
- public class AVLTree
- extends BinarySearchTree
-
- protected int Height
- public void attachKey(Object object)
-
- if(!isEmpty())
- throw new InvalidOperationException()
- key object
- left new AVLTree()
- right new AVLTree()
- Height 0
-
- // ...
64Remoção de itens de Árvores AVL
65Método detachKey
- // pgm10_13.java
- public class AVLTree
- extends BinarySearchTree
-
- protected int Height
- public Object detachKey()
-
- Height -1
- return super.detachKey()
-
- // ...
66Árvores de Busca de Múltiplos caminhos
67Implementação
68Classe MwayTree Métodos construtor e getM
- // pgm10_14.java
- public class MWayTree
- extends AbstractTree
- implements SearchTree
-
- protected Comparable key
- protected MWayTree subtree
- public MWayTree(int m)
-
- if(m lt 2)
- throw new IllegalArgumentException(grau
inválido") - key new Comparablem
- subtree new MWayTreem
-
- int getM()
- return subtree.length
- // ...
69Travessia em ordem infixa de árvores binárias de
busca
- Travessias infixas de árvores binárias são da
forma - Percorrer a sub árvore da esquerda
- Visitar a raiz
- Percorre a sub árvore da direita
- Isto corresponde a, em uma travessia infixa de
uma árvore binária de busca, visitar a todos os
registros armazenados na árvore em ordem
70Travessia em ordem infixa
- Travessias infixas não são definidas para árvores
N-arias - Em árvores de busca M-Way a travessia infixa é
definida como a visita a todos os registros
armazenados na árvore em ordem
71Travessia de um nó de uma árvore de busca M-Way
- Percorrer a sub árvore T0
- Visitar o objeto k1
- Percorrer a sub árvore T1
- Visitar o objeto k2
- Percorrer a sub árvore T2
- .
- .
- .
- Visitar o objeto kn-1
- Percorrer a sub árvore Tn-1
72Método depthFirstTraversal (1)
- // pgm10_15.java
- public class MWayTree
- extends AbstractTree
- implements SearchTree
-
- protected Comparable key
- protected MWayTree subtree
- public void depthFirstTraversal
(PrePostVisitor visitor) -
- if(!isEmpty())
-
- for(int i 0 i lt count 1 i)
-
73Método depthFirstTraversal (2)
- if(i gt 2)
- visitor.postVisit(keyi - 1)
- if(i gt 1 i lt count)
- visitor.inVisit(keyi)
- if(i lt count - 1)
- visitor.preVisit(keyi 1)
- if(i lt count)
- subtreei.depthFirstTraversal(visitor)
-
-
-
-
74Busca linear de itens em Árvores M-Way
75Método find (1)
- // pgm10_16.java
- public class MWayTree
- extends AbstractTree
- implements SearchTree
-
- protected Comparable key
- protected MWayTree subtree
- public Comparable find(Comparable object)
-
- if(isEmpty())
- return null
- int i
76Método find (2)
- for(i count i gt 0 --i)
-
- int diff object.compare(keyi)
- if(diff 0)
- return keyi
- if(diff gt 0)
- break
-
- return subtreei.find(object)
-
- // ...
77Inclusão de itens
78Método insert (1)
- // pgm10_18.java
- public void insert (Comparable object)
-
- if(isEmpty())
-
- subtree0 new MWayTree(getM())
- key1 object
- subtree1 new MWayTree(getM())
- count 1
-
- else
-
- int index findIndex(object)
- if(index ! 0 object.isEQ(keyindex))
- throw new IllegalArgumentException
- (chave duplicada")
79Método insert (2)
- if(!isFull())
-
- for(int i count i gt index --i)
-
- keyi 1 keyi
- subtreei 1 subtreei
-
- keyindex 1 object
- subtreeindex 1 new MWayTree(getM())
- count
-
- else
- subtreeindex.insert(object)
-
80Remoção de itens
81Método withdraw (1)
- public void withdraw (Comparable object)
-
- if(isEmpty())
- throw new IllegalArgumentException
- ("objeto não
encontrado") - int index findIndex(object)
- if(index ! 0 object.isEQ(keyindex))
-
- if(!subtreeindex - 1.isEmpty())
-
- Comparable max subtreeindex -
1.findMax() - keyindex max
- subtreeindex - 1.withdraw(max)
-
- else
82Método withdraw (2)
- if(!subtreeindex.isEmpty())
-
- Comparable min subtreeindex.findMin()
- keyindex min
- subtreeindex.withdraw(min)
-
- else
-
- --count
- int i
- for(i index i lt count i)
-
- keyi keyi 1
- subtreei subtreei 1
-
83Método withdraw (3)
- keyi null
- subtreei null
- if(count 0)
- subtree0 null
-
-
- else
- subtreeindex.withdraw(object)
84Implementação C
85Implementação de Árvores de Busca
86Definição da Classe SearchTree
- // pgm10_01.cpp
- class SearchTree
- public virtual Tree, public virtual
SearchableContainer -
- public
- virtual Object FindMin() const 0
- virtual Object FindMax() const 0
87Definição da Classe BST
- // pgm10_02.cpp
- class BST public BinaryTree, public SearchTree
-
- protected
- virtual void AttachKey(Object)
- virtual Object DetachKey()
- virtual void Balance()
- public
- BST Left() const
- BST Right() const
- // ...
88Funções da Classe BinarySearchTree
- left
- right
- find
- findMin
- insert
- attachKey
- withdraw
- detachKey
89Definições da Função Membro Left e Rigth da
Classe BST
- // pgm10_03.cpp
- BST BSTLeft() const
- return dynamic_castltBSTgt(BinaryTreeLeft
()) - BST BSTRight() const
- return dynamic_castltBSTgt(BinaryTreeRight
())
90Definições da Função Membro Find e FindMin da
Classe BST (1)
- // pgm10_04.cpp
- Object BSTFind(Object const object) const
-
- if(IsEmpty ())
- return NullObjectInstance()
- int const diff object.Compare(key)
- if(diff 0)
- return key
- else
- if(diff lt 0)
- return Left().Find(object)
- else
- return Right().Find(object)
91Definições da Função Membro Find e FindMin da
Classe BST (2)
- Object BSTFindMin() const
-
- if(IsEmpty ())
- return NullObjectInstance()
- else
- if(Left().IsEmpty())
- return key
- else
- return Left().FindMin()
92Inserção de itens em BST
- A inclusão de nós em árvores de busca deve ser
precedida de uma operação de busca. Esta operação
indica se o nó buscado já existe na árvore e, em
caso de não existência, o local aonde deve ser
feita a inclusão. Convém lembrar que uma busca
sempre termina em folha e os nós a incluir serão
incluídos como filhos da folha aonde se encerrou
a busca.
93Definições da Função Membro Insert, AttachKey e
Balance da Classe BST (1)
- // pgm10
- _05.cpp
- void BSTInsert(Object object)
-
- if(IsEmpty ())
- AttachKey(object)
- else
- int const diff object.Compare(key)
- if(diff 0)
- throw invalid_argument(chave duplicada")
- if(diff lt 0)
- Left().Insert(object)
- else
- Right().Insert(object)
-
- Balance()
94Definições da Função Membro Insert, AttachKey e
Balance da Classe BST (2)
- void BSTAttachKey(Object object)
-
- if(!IsEmpty ())
- throw domain_error("operação inválida")
- key object
- left new BST()
- right new BST()
-
- void BSTBalance()
-
95Remoção de itens em BST
- A exclusão de nós em árvores de busca pode
configurar um de 3 casos. - Se o nó não tiver filhos pode ser excluído sem
exigir ajustamento da árvore. - Se o nó a excluir tiver apenas uma sub árvore,
este nó pode ser excluído e deve ser substituído
por seu filho único. - Se o nó a excluir tiver mais de um filho, para
que ele possa ser excluído, deve ser substituído
por seu antecessor ou seu sucessor em ordem
infixa. O nó substituto deve ser excluído da sua
posição gerando outro processo de exclusão. - Considerando o caso do sucessor em ordem infixa,
o nó a ser excluído deve ser substituído pelo nó
obtido alcançando-se o nó mais à esquerda da sub
árvore direita do nó a excluir.
96Remoção de itens em BST
- Remoção do nó (4) folha em BST
- Remoção do nó (1) não folha em BST
97Definições da Função Membro Withdraw e DetachKey
da Classe BST (1)
- // pgm10_06.cpp
- void BSTWithdraw(Object object)
-
- if(IsEmpty ())
- throw invalid_argument("objeto não
encontrado") - int const diff object.Compare(key)
- if(diff 0)
-
- if(!Left().IsEmpty())
-
- Object max Left().FindMax()
- key max
- Left().Withdraw(max)
-
98Definições da Função Membro Withdraw e DetachKey
da Classe BST (2)
- else
- if(!Right().IsEmpty())
-
- Object min Right().FindMin()
- key min
- Right().Withdraw(min)
-
- else
- DetachKey()
-
- else
- if(diff lt 0)
- Left().Withdraw(object)
- else
- Right().Withdraw(object)
- Balance()
99Definições da Função Membro Withdraw e DetachKey
da Classe BST (3)
- Object BSTDetachKey()
-
- if(!IsLeaf ())
- throw domain_error("operação inválida")
- Object result key
- delete left
- delete right
- key 0
- left 0
- right 0
- return result
100Implementação de árvores AVL
101Conceito de AVL
- Adelson-Velskii e Landis propuseram as condições
de balanceamento para uma árvore binária que
recebeu como sigla suas iniciais. - Definição (Condição de equilíbrio AVL) Uma
árvore binária vazia é AVL balanceada . Uma
árvore binária não-vazia, Tr,TL,TR , é AVL
balanceada se tanto TL quanto TR forem AVL
balanceadas e hL-hRlt1 -
- aonde hL é a altura of TL e hR é a altura of TR .
102Implementação de árvores AVL
103Definição da Classe AVLTree (1)
- // pgm10_07.cpp
- class AVLTree public BST
-
- protected
- int height
- int BalanceFactor() const
- void AdjustHeight()
- void LLRotation()
- void LRRotation()
- void RRRotation()
- void RLRotation()
- void AttachKey(Object)
- Object DetachKey()
- void Balance()
104Definição da Classe AVLTree (2)
- public
- AVLTree()
- int Height() const
- AVLTree Left() const
- AVLTree Right() const
105Definições da Função Membro Height, AdjustHeight
e BalanceFactor e do Construtor da Classe AVLTree
(1)
- // pgm10_08.cpp
- AVLTreeAVLTree()
- BST(),
- height(-1)
-
- int AVLTreeHeight() const
- return height
- void AVLTreeAdjustHeight()
-
- if(IsEmpty ())
- height -1
- else
- height Max(left-gtHeight(), right-gtHeight())
1
106Definições da Função Membro Height, AdjustHeight
e BalanceFactor e do Construtor da Classe AVLTree
(2)
- int AVLTreeBalanceFactor() const
-
- if(IsEmpty ())
- return 0
- else
- return left-gtHeight() - right-gtHeight()
107Definição da Função Membro LLRotation da Classe
AVLTree
- // pgm10_09.cpp
- void AVLTreeLLRotation()
-
- if(IsEmpty ())
- throw domain_error(rotação inválida")
- BinaryTree const tmp right
- right left
- left Right().left
- Right().left Right().right
- Right().right tmp
- Object const tmpObj key
- key Right().key
- Right().key tmpObj
- Right().AdjustHeight()
- AdjustHeight()
108Definição da Função Membro LRRotation da Classe
AVLTree
- // pgm10_10.cpp
- void AVLTreeLRRotation()
-
- if(IsEmpty ())
- throw domain_error("rotação inválida")
- Left().RRRotation()
- LLRotation()
109Definição da Função Membro Balance da Classe
AVLTree
- // pgm10_11.cpp
- void AVLTreeBalance()
- AdjustHeight()
- if(abs(BalanceFactor ()) gt 1)
- if(BalanceFactor() gt 0)
- if(Left().BalanceFactor() gt 0)
- LLRotation()
- else
- LRRotation()
-
- else
- if(Right().BalanceFactor() lt 0)
- RRRotation()
- else
- RLRotation()
-
-
110Definições das Função Membro AttachKey e
DetachKey da Classe AVLTree
- // pgm10_12.cpp
- void AVLTreeAttachKey(Object object)
-
- if(!IsEmpty ())
- throw domain_error("operação inválida")
- key object
- left new AVLTree()
- right new AVLTree()
- height 0
-
- Object AVLTreeDetachKey()
- height -1 return BSTDetachKey ()
111Definição da Classe MWayTree
- // pgm10_13.cpp
- class MWayTree public SearchTree
-
- protected
- unsigned int const m
- unsigned int numberOfKeys
- ArrayltObjectgt key
- ArrayltMWayTreegt subtree
- unsigned int FindIndex(Object const) const
- public
- MWayTree(unsigned int)
- MWayTree()
- Object Key(unsigned int) const
- MWayTree Subtree(unsigned int) const
- // ...
112Definição da Função Membro DepthFirstTraversal da
Classe MWayTree
- // pgm10_14.cpp
- void MWayTreeDepthFirstTraversal(
PrePostVisitor visitor) const -
- if(!IsEmpty ())
-
- for(int i 0 i lt numberOfKeys 1 i)
-
- if(i gt 2)
- visitor.PostVisit(key i - 1)
- if(i gt 1 i lt numberOfKeys)
- visitor.Visit(key i)
- if(i lt numberOfKeys - 1)
- visitor.PreVisit(key i 1)
- if(i lt count)
- subtreei-gtDepthFirstTraversal (visitor)
-
113Definição (Linear Search) da Função Membro Find
da Classe MWayTree
- // pgm10_15.cpp
- Object MWayTreeFind(Object const object)
const -
- if(IsEmpty ())
- return NullObjectInstance()
- unsigned int i numberOfKeys
- while(i gt 0)
-
- int const diff object.Compare(keyi)
- if(diff 0)
- return keyi
- if(diff gt 0)
- break
- --i
-
- return subtreei-gtFind(object)
114Definições (Binary Search) da Função FindIndex e
Find da Classe MWayTree (1)
- // pgm10_16.cpp
- unsigned int MWayTreeFindIndex(Object const
object) const -
- if(IsEmpty ())
- throw domain_error("operação inválida")
- if(object lt key1)
- return 0
- unsigned int left 1
- unsigned int right numberOfKeys
- while(left lt right)
- int const middle (left right 1) / 2
- if(object gt keymiddle)
- left middle
- else
- right middle - 1U
-
- return left
115Definições (Binary Search) da Função FindIndex e
Find da Classe MWayTree (2)
- Object MWayTreeFind(Object const object)
const -
- if(IsEmpty ())
- return NullObjectInstance()
- unsigned int const index FindIndex(object)
- if(index ! 0 object keyindex)
- return keyindex
- else
- return subtreeindex-gtFind(object)
116Definição da Função Membro Insert da Classe
MWayTree (1)
- // pgm10_17.cpp
- void MWayTreeInsert(Object object)
-
- if(IsEmpty ())
-
- subtree0 new MWayTree(m)
- key1 object
- subtree1 new MWayTree(m)
- numberOfKeys 1
-
- else
-
- unsigned int const index FindIndex(object)
- if(index ! 0 object keyindex)
- throw invalid_argument(chave duplicada")
- if(numberOfKeys lt m - 1U)
-
117Definição da Função Membro Insert da Classe
MWayTree (2)
- for(unsigned int i numberOfKeys i gt index
--i) -
- keyi 1 keyi
- subtreei 1 subtreei
-
- keyindex 1 object
- subtreeindex 1 new MWayTree(m)
- numberOfKeys
-
- else
- subtreeindex-gtInsert(object)
-
118Definição da Função Membro Withdraw da Classe
MWayTree (1)
- // pgm10_18.cpp
- void MWayTreeWithdraw(Object object)
-
- if(IsEmpty ())
- throw invalid_argument("objeto não
encontrado") - unsigned int const index FindIndex(object)
- if(index ! 0 object keyindex)
-
- if(!subtreeindex - 1U-gtIsEmpty())
-
- Object max subtreeindex - 1U-gtFindMax()
- keyindex max
- subtreeindex - 1U-gtWithdraw(max)
-
119Definição da Função Membro Withdraw da Classe
MWayTree (2)
- else
- if(!subtreeindex-gtIsEmpty())
-
- Object min subtreeindex-gtFindMin()
- keyindex min
- subtreeindex-gtWithdraw(min)
-
- else
-
- --numberOfKeys
- delete subtreeindex
- for(unsigned int i index
- i lt numberOfKeys i)
-
- keyi keyi 1
- subtreei subtreei 1
-
120Definição da Função Membro Withdraw da Classe
MWayTree (3)
- if(numberOfKeys 0)
- delete subtree0
-
-
- else subtreeindex-gtWithdraw(object)
121Definição da Classe BTree
- // pgm10_19.cpp
- class BTree public MWayTree
-
- BTree parent
- void InsertPair(Object, BTree)
- void AttachKey(unsigned int, Object)
- void AttachSubtree(unsigned int, MWayTree)
- Object InsertKey(unsigned int, Object)
- BTree InsertSubtree(unsigned int, BTree)
- void AttachLeftHalfOf(BTree const)
- void AttachRightHalfOf(BTree const, Object,
BTree) - public
- BTree(unsigned int)
- BTree(unsigned int, BTree)
- void Insert(Object)
- void Withdraw(Object)
122Definição da Função Membro Insert da Classe BTree
(1)
- // pgm10_20.cpp
- void BTreeInsert(Object object)
-
- if(IsEmpty ())
-
- if(parent 0)
-
- AttachSubtree(0, new BTree(m, this))
- AttachKey(1, object)
- AttachSubtree(1, new BTree(m, this))
- numberOfKeys 1
-
- else
- parent-gtInsertPair(object, new BTree(m,
parent)) -
123Definição da Função Membro Insert da Classe BTree
(2)
- else
-
- unsigned int const index FindIndex(object)
- if(index ! 0 object keyindex)
- throw invalid_argument(chave duplicada")
- subtreeindex-gtInsert(object)
-
124Definição da Função Membro InsertPair da Classe
BTree (1)
- // pgm10_21.cpp
- void BTreeInsertPair(Object object, BTree
child) -
- unsigned int const index FindIndex(object)
- BTree extraTree InsertSubtree(index 1,
child) - Object extraKey InsertKey(index 1, object)
- if(numberOfKeys m)
-
- if(parent 0)
-
- BTree left new BTree(m, this)
- BTree right new BTree(m, this)
- left.AttachLeftHalfOf(this)
125Definição da Função Membro InsertPair da Classe
BTree (2)
- right.AttachRightHalfOf(this, extraKey,
extraTree) - AttachSubtree(0, left)
- AttachKey(1, key(m 1)/2)
- AttachSubtree(1, right)
- numberOfKeys 1
-
- else
-
- numberOfKeys (m 1) / 2 - 1
- BTree right new BTree(m, parent)
- right.AttachRightHalfOf(this, extraKey,
extraTree) - parent-gtInsertPair(key(m 1)/2, right)
-
-