-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathNoArvB.cpp
105 lines (85 loc) · 1.88 KB
/
NoArvB.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include "NoArvB.h"
#include <iostream>
#include <stdlib.h>
using namespace std;
NoArvB::NoArvB(int m, bool folha) {
this->m =m;
this->folha = folha;
chaves = new int[2*m-1];
filhos = new NoArvB*[2*m];
n = 0;
}
NoArvB::~NoArvB(){ }
int * NoArvB::getChaves()
{
return chaves;
}
void NoArvB::setM(int val)
{
m = val;
}
int NoArvB::getM()
{
return m;
}
void NoArvB::setN(int val)
{
n = val;
}
int NoArvB::getN()
{
return n;
}
void NoArvB::setFolha(bool val)
{
folha = val;
}
bool NoArvB::ehFolha()
{
return folha;
}
int NoArvB::getId(int pos)
{
return chaves[pos];
}
void NoArvB::addFilho(NoArvB * filho)
{
filhos[n-1] = filho;
}
NoArvB** NoArvB::getFilhos()
{
return filhos;
}
void NoArvB::cisao(int i, NoArvB *p)
{
// novo nó para guardar metade das chaves de p;
NoArvB *r = new NoArvB(p->getM(), p->ehFolha());
r->setN(m-1);
// copia de metade das chaves de p para o nó r
for (int j = 0; j < m-1; j++)
r->getChaves()[j] = p->getChaves()[j+m];
// copia da metade dos filhos de p para r (m)
if (!p->ehFolha())
{
for (int j = 0; j < m; j++)
r->getFilhos()[j] = p->getFilhos()[j+m];
}
// nó p perde metade das chaves
p->setN(m-1);
// o nó que chama a cisão receberá um novo filho
//então liberamos espaço para ele
for (int j = n; j >= i+1; j--)
filhos[j+1] = filhos[j];
// insere o filho na posição liberada
filhos[i+1] = r;
// uma chave de p será movida para o nó q
//então encontramos o local para inserção
for (int j = n-1; j >= i; j--)
chaves[j+1] = chaves[j];
// chave central do conjunto é promovida a raiz
//neste ponto (i=0)
chaves[i] = p->getChaves()[m-1];
//os filhos dessa raiz são os nós r e p
//incrementa o número de chaves
n = n + 1;
}