C++로 이진 트리 그리기

2020-01-18, Sat

이진 탐색 트리를 만들긴 만들었는데 간단한 시각화 도구가 필요해 그냥 직접 만들었다.

밑의 값을 수정해보면 자동으로 그려진다.

트리는 예전에 배운거 리마인드하고 예제 소스 좀 읽고 나서 짰고, SVG는 스펙 조금 읽고 그냥 채웠다. 다만 텍스트 위치가 이쁘게 조절이 안되는게 흠. 노드를 지우지는 않을거라 일단 추가만 구현했다. 필요하면 지우는거나 AVL같은 것도 구현하지 뭐.

그리는 부분은 빼고 핵심만 담은 코드.

template <typename T>
class Tree
{
	struct Node
	{
		T value{};
		std::unique_ptr<Node> L, R;
		size_t depth = 0;

		Node(T _value) : value{_value} {}

		size_t insert(T _value)
		{
			if constexpr (std::is_floating_point_v<T>)
			{
				if (std::abs(_value - value) < 0.000001)
					return 0;
			}
			else
			{
				if (_value == value)
					return 0;
			}
			auto& child = (_value < value) ? L : R;
			if (child)
				return child->insert(_value);
			child = std::make_unique<Node>(_value);
			return (child->depth = depth + 1);
		}
	};
	std::unique_ptr<Node> root = nullptr;
	size_t depth		   = 0;

public:
	void insert(T _val)
	{
		if (root)
			depth = std::max(depth, root->insert(_val));
		else
			root = std::make_unique<Node>(_val);
	}
};