일지

알고리즘...69

niamdank 2021. 10. 14. 14:22

B 트리 삽입 함수 구현 진행

노드에 키를 삽입하기 위해 여러 확인이 필요한데 우선 단순히 키를 삽입하는 함수를 구현했다.

 

BTree::Insert

/// <summary>
/// 새 키를 기존 키의 왼쪽에 삽입한다.
/// </summary>
/// <param name="newKey">삽입할 키</param>
void BTreeNodeKey::AddKeyToPrev(BTreeNodeKey* newKey)
{
	BTreeNodeKey* prevKey{ prev };
	if (prevKey != nullptr)
	{
		prevKey->next = newKey;
		newKey->prev = prevKey;
	}
	newKey->next = this;
	prev = newKey;
}

/// <summary>
/// 새 키를 기존 키의 오른쪽에 삽입한다.
/// </summary>
/// <param name="newKey">삽입할 키</param>
void BTreeNodeKey::AddKeyToNext(BTreeNodeKey* newKey)
{
	BTreeNodeKey* nextKey{ next };
	if (nextKey != nullptr)
	{
		nextKey->prev = newKey;
		newKey->next = nextKey;
	}
	newKey->prev = this;
	next = newKey;
}

/// <summary>
/// 노드에 데이터를 삽입한다.
/// </summary>
/// <param name="data">삽입할 데이터</param>
bool BTreeNode::Insert(int data)
{
	if (size == TotalKeyCount)
	{
		return false;
	}

	if (keyRoot == nullptr)
	{
		keyRoot = keyManager->Pop();
		keyRoot->Set(data);
		size++;
		return true;
	}

	BTreeNodeKey* newKey{ keyManager->Pop() };
	newKey->value = data;

	// 현재 키 중 가장 작은 값인 경우
	if (data < keyRoot->value)
	{
		keyRoot->AddKeyToPrev(newKey);
		keyRoot = newKey;
		size++;
		return true;
	}

	BTreeNodeKey* key{ keyRoot };
	while (key->next != nullptr)
	{
		if (data < key->value)
		{
			key->AddKeyToPrev(newKey);
			size++;
			return true;
		}

		key = key->next;
	}

	key->AddKeyToNext(newKey);
	size++;

	return true;
}

 

그런데 단순히 이 함수만을 이용해 작업하기에는 다른 노드를 가져와 처리하도록 하는 게 쉽지가 않다.

 

루트 노드에서 삽입 가능한 노드를 문의해 최적 노드를 반환하도록 하는 함수를 만들고 해당 노드에 삽입 처리 후 사이즈 문제로 실패한 경우 오버플로우 처리로 넘어가도록 해야 할 것 같다.