일지

알고리즘...79

niamdank 2021. 11. 2. 02:43

디버그를 위한 출력 함수 구현

삽입과 삭제에서 적절하게 처리가 되지 않아 디버깅을 하기 위해 출력 함수를 구현했다.

 

BTree

/// <summary>
/// 트리를 텍스트로 출력한다.
/// </summary>
void BTree::PrintTree()
{
	std::cout << "\n--------------------\n";

	if (_root == nullptr)
	{
		std::cout << "EMPTY TREE";
	}
	else
	{
		int nodeCount{ 1 };
		int counter{ 0 };

		_queue.push(_root);
		while (!_queue.empty())
		{
			BTreeNode* node{ _queue.front() };
			_queue.pop();

			if (counter == nodeCount)
			{
				counter = 0;
				nodeCount *= BTreeNode::TotalKeyCount;
				std::cout << '\n';
			}

			BTreeNodeKey* key{ node->keyRoot };
			if (key->left != nullptr)
			{
				_queue.push(key->left);
			}

			std::cout << '[';
			while (key != nullptr)
			{
				if (key->right != nullptr)
				{
					_queue.push(key->right);
				}
				std::cout << key->value << (key->next != nullptr ? ", " : "");
				key = key->next;
			}
			std::cout << ']';

			counter++;
		}
	}

	std::cout << "\n--------------------\n";
}

 

main.cpp

#include "Common.h"
#include "검색트리/BTree.h"

int main()
{
	int n = 9;
	int* arr;

	// 동작 테스트를 위한 값
	arr = new int[n]{ 10, 5, 20, 3, 7, 15, 25, 1, 4 };

	BTree tree;
	for (int i = 0; i < n; i++)
	{
		tree.Insert(arr[i]);
		tree.PrintTree();
	}

	tree.Delete(5);

	tree.Delete(10);

	tree.Delete(15);

	delete[] arr;
}

 

실행결과

--------------------
[10]
--------------------

--------------------
[5, 10]
--------------------

--------------------
[5, 10, 20]
--------------------

--------------------
[5]
[3, 3, 3, 3, 3, 3, 3, 3,

 

분할이 일어날 때 prev와 next 값이 초기화가 되지 않아서 발생한 것 같다.

 

확인해보니 GetBiggestKey 에서 반환 값이 keyRoot 일 때 처리를 하지 않아서 발생한 것이었고 수정한 이후에는 다른 버그가 발생했다.

 

실행결과2

--------------------
[10]
--------------------

--------------------
[5, 10]
--------------------

--------------------
[5, 10, 20]
--------------------

--------------------
[5]
[3][10, 20]
--------------------

--------------------
[5]
[3][7, 10, 20]
--------------------

--------------------
[7]
[3, 5, 10, 15, 20][10, 15, 20]
--------------------

--------------------
[10]
[3, 5, 7, 15, 20, 25][15, 20, 25]
--------------------

 

15를 삽입하면서 값이 분할되고 부모 노드가 있으니 부모 노드에 삽입 처리가 되어야 하는데 뭔가 정상적으로 동작하지 않았다.