일지
알고리즘...62
niamdank
2021. 10. 5. 16:54
B 트리의 노드 관리를 위한 매니저 클래스
이전 트리의 구현과 마찬가지로 노드 관리를 위한 매니저 클래스를 구현한다.
BTreeNode
struct BTreeNode;
/// <summary>
/// B 트리의 노드에서 사용할 키
/// </summary>
struct BTreeNodeKey
{
BTreeNodeKey() : left(nullptr), value(0), right(nullptr) {}
void Clear()
{
left = nullptr;
value = 0;
right = nullptr;
}
BTreeNode* left;
int value;
BTreeNode* right;
};
/// <summary>
/// B 트리에 사용할 노드
/// </summary>
struct BTreeNode
{
static const size_t TotalKeyCount{ 4 };
BTreeNode() : parent(nullptr)
{
keys = new BTreeNodeKey[TotalKeyCount];
}
~BTreeNode()
{
delete[] keys;
}
void Clear()
{
parent = nullptr;
for (int i = 0; i < TotalKeyCount; i++)
{
keys[i].Clear();
}
}
BTreeNode* parent;
BTreeNodeKey* keys;
};
BTreeNodeManager
/// <summary>
/// B 트리에서 노드의 재활용을 위한 매니저
/// </summary>
class BTreeNodeManager
{
public:
~BTreeNodeManager();
void Push(BTreeNode* node);
BTreeNode* Pop();
private:
BTreeNode* nodes;
};
/// <summary>
/// 가지고 있던 노드를 모두 안전하게 제거한다.
/// </summary>
BTreeNodeManager::~BTreeNodeManager()
{
while (nodes != nullptr)
{
BTreeNode* node{ nodes };
nodes = nodes->parent;
delete node;
}
}
/// <summary>
/// 사용 완료한 노드를 저장한다.
/// </summary>
/// <param name="node">사용 완료한 노드</param>
void BTreeNodeManager::Push(BTreeNode* node)
{
node->parent = nodes;
nodes = node;
}
/// <summary>
/// 사용할 노드를 인출한다.
/// </summary>
/// <returns>사용할 노드</returns>
BTreeNode* BTreeNodeManager::Pop()
{
BTreeNode* node{ nodes };
if (node != nullptr)
{
nodes = node->parent;
node->Clear();
}
else
{
node = new BTreeNode();
}
return node;
}