-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathDiskKDNode.cpp
146 lines (115 loc) · 2.89 KB
/
DiskKDNode.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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#include <cassert>
#include "DiskKDNode.h"
using namespace std;
DiskKDNode::DiskKDNode(uint64_t value, int32_t treeShape, bool isDisk) {
m_treeShape = treeShape;
m_isDisk = isDisk;
if(isDisk) {
// 此节点为根的子树存储在磁盘上,value代表磁盘页的页号。
m_diskNum = value;
} else {
//KD数内部节点,value 表示节点的分裂值。
m_value = value;
}
m_leftChild = NULL;
m_rightChild = NULL;
m_pointNode = false;
m_point = NULL;
m_sa = NULL;
}
DiskKDNode::DiskKDNode(uint64_t nPoint, bool isPointNode) {
assert(isPointNode == true);
m_pointNode = isPointNode;
m_point = new vector<pair<uint64_t, uint64_t> >();
m_sa = new vector<uint64_t>();
m_treeShape = -1;
m_isDisk = false;
m_diskNum = -1;
m_value = 0;
m_leftChild = NULL;
m_rightChild = NULL;
}
DiskKDNode::~DiskKDNode() {
//析构函数,回收点集所占用的空间。
if(m_pointNode && m_point != NULL) {
delete m_point;
m_point = NULL;
}
if(m_pointNode && m_sa != NULL){
delete m_sa;
m_sa = NULL;
}
}
void DiskKDNode::setRect(Rect r) {
m_rect = r;
}
Rect DiskKDNode::getRect() {
return m_rect;
}
void DiskKDNode::setDepth(int32_t depth) {
m_depth = depth;
if(m_depth % 2 == 1)
m_split = true;
else
m_split = false;
}
int32_t DiskKDNode::getDepth() {
return m_depth;
}
bool DiskKDNode::getSplit() {
return m_split;
}
void DiskKDNode::setLeftChild(DiskKDNode* left) { m_leftChild = left; }
void DiskKDNode::setRightChild(DiskKDNode* right) { m_rightChild = right; }
DiskKDNode* DiskKDNode::getLeftChild() { return m_leftChild; }
DiskKDNode* DiskKDNode::getRightChild() { return m_rightChild; }
int32_t DiskKDNode::getTreeShape() {
return m_treeShape;
}
int32_t DiskKDNode::setTreeShape(int32_t treeShape) {
int32_t result = m_treeShape;
m_treeShape = treeShape;
return result;
}
bool DiskKDNode::isPointNode() {
return m_pointNode;
}
uint64_t DiskKDNode::getPointNum() {
assert(isPointNode() && m_point != NULL);
return m_point->size();
}
pair<uint64_t, uint64_t> DiskKDNode::getPoint(uint64_t idx) {
assert(isPointNode() && m_point != NULL);
return (*m_point)[idx];
}
void DiskKDNode::setPoint(uint64_t idx, uint64_t x, uint64_t y) {
assert(m_pointNode == true && m_point != NULL);
m_point->push_back(make_pair(x, y));
}
uint64_t DiskKDNode::getSA(uint64_t idx){
assert(m_pointNode == true && m_sa != NULL);
return (*m_sa)[idx];
}
void DiskKDNode::setSA(uint64_t idx, uint64_t saValue){
assert(m_pointNode == true && m_sa != NULL);
m_sa->push_back(saValue);
}
bool DiskKDNode::isDiskNode() {
return m_isDisk;
}
int32_t DiskKDNode::getDiskNum() {
assert(m_isDisk == true);
return m_diskNum;
}
//删除以root为根的二叉树。
void DiskKDNode::RemoveTree(DiskKDNode* root) {
DiskKDNode* left = root->getLeftChild();
DiskKDNode* right = root->getRightChild();
if(left != NULL) {
RemoveTree(left);
}
if(right != NULL) {
RemoveTree(right);
}
delete root;
}