-
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; }