트리 베이스

레이어드 구조 가지다 데이터 표현하다 ~을 위한 구조

마디(마디): 데이터 표현하다

트렁크(가장자리): 마디 계층 구조 표현하다 ~을 위한 사용


이것 나무 구조 가지다 할 때 코드 화신

#include <iostream>
#include <vector>
#include <stack>
#include <list>
#include <queue>
using namespace std;

using NodeRef = shared_ptr<struct Node>;

struct Node
{
	Node() {}
	Node(const string& data) : data(data) {}
	string			data;
	vector<NodeRef>	childen;
};

NodeRef CreateTree()
{
	NodeRef root = make_shared<Node>("R1 개발실");
	{
		{
			NodeRef node = make_shared<Node>("디자인팀");
			root->childen.push_back(node);
			{
				NodeRef leaf = make_shared<Node>("전투");
				node->childen.push_back(leaf);
			}
			{
				NodeRef leaf = make_shared<Node>("경제");
				node->childen.push_back(leaf);
			}
			{
				NodeRef leaf = make_shared<Node>("스토리");
				node->childen.push_back(leaf);
			}
		}
		{
			NodeRef node = make_shared<Node>("프로그래밍팀");
			root->childen.push_back(node);
			{
				NodeRef leaf = make_shared<Node>("서버");
				node->childen.push_back(leaf);
			}
			{
				NodeRef leaf = make_shared<Node>("클라");
				node->childen.push_back(leaf);
			}
			{
				NodeRef leaf = make_shared<Node>("엔진");
				node->childen.push_back(leaf);
			}
		}
		{
			NodeRef node = make_shared<Node>("아트팀");
			root->childen.push_back(node);
			{
				NodeRef leaf = make_shared<Node>("배경");
				node->childen.push_back(leaf);
			}
			{
				NodeRef leaf = make_shared<Node>("케릭터");
				node->childen.push_back(leaf);
			}
		}
	}

	return root;

}

void PrintTree(NodeRef root, int depth)
{
	for (int i = 0; i < depth; i++)
		cout << "-";

	cout << root->data << endl;

	for (NodeRef& child : root->childen)
		PrintTree(child, depth+1);
}

//깊이(depth) :  루트에서 어떤 노드에 도달하기 위해 거쳐야 하는 간선의 수(aka. 몇층?)
//높이(height) : 가장 깊숙히 있는 노드의 깊이(max(depth))
int GetHeight(NodeRef root)
{
	int height = 1;

	for (NodeRef& child : root->childen)
	{
		height = max(height, GetHeight(child) + 1);
	}

	return height;
}

int main()
{
	NodeRef root = CreateTree();

	PrintTree(root, 0);

	int count = GetHeight(root);
	cout << "Three height : " << count << endl;

	return 0;
}