일지

알고리즘...48

niamdank 2021. 9. 6. 00:59

이진 검색 트리 출력 함수 제작

깊이가 2 인 경우의 출력 완료

 

BinarySearchTree.cpp

/// <summary>
/// 이진 검색 트리를 출력한다.
/// </summary>
void BinarySearchTree::PrintBinarySearchTree()
{
	if (_root == nullptr)
	{
		std::cout << "EMPTY\n";
		return;
	}

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

		PrintBinarySearchTree(node);

		if (node->left != nullptr)
		{
			_queue.push(node->left);
		}
		if (node->right != nullptr)
		{
			_queue.push(node->right);
		}
	}
	std::cout << "\n\n";
}

/// <summary>
/// 이진 검색 트리를 출력한다.
/// </summary>
/// <param name="node">현재 출력할 노드</param>
void BinarySearchTree::PrintBinarySearchTree(BinarySearchNode* node)
{
	int depth{ node->GetMaxDepth() };
	int center{ (depth - 1) * 5 / 2 };

	bool isNeedReturn{ ((node == _root) || IsRightNode(node) && IsRightNode(node->parent)) };

	for (int i = 0; i < center; i++)
	{
		std::cout << ' ';
	}
	std::cout << node->data;
	for (int i = 0; i < center; i++)
	{
		std::cout << ' ';
	}

	if (isNeedReturn)
	{
		std::cout << '\n';
	}

	if (node->HasLeftChild())
	{
		std::cout << "┌";
		for (int i = 1; i < center; i++)
		{
			std::cout << "─";
		}
	}
	else
	{
		for (int i = 0; i < center; i++)
		{
			std::cout << ' ';
		}
	}

	if (node->HasLeftChild() || node->HasRightChild())
	{
		std::cout << "┴";
	}

	if (node->HasRightChild())
	{
		for (int i = 1; i < center; i++)
		{
			std::cout << "─";
		}
		std::cout << "┐";
	}
	else
	{
		for (int i = 0; i < center + 3; i++)
		{
			std::cout << ' ';
		}
	}

	if (isNeedReturn)
	{
		std::cout << '\n';
	}
}

 

main.cpp

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

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

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

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

	//tree.Delete(5);
	//tree.PrintBinarySearchTree();

	// 출력하고 싶은 모양
	std::cout << "  10\n";
	std::cout << "┌─┴─┐\n";
	std::cout << "5   20\n";

	delete[] arr;
}

 

실행결과

  10
┌─┴─┐
5   20

  10
┌─┴─┐
5   20