ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 알고리즘...62
    일지 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;
    }

    댓글

Designed by Tistory.