일반적인 형태는 각 노드를 하나의 구조체/객체로 표현하고, 이들을 서로의 포인터로 연결하는 것이다. 각 노드는 자신의 부모와 모든 자손들에 대한 포인터를 가지고 있다.
struct TreeNode
{
string label; // 저장할 자료 (물론 꼭 문자열일 필요는 없다.)
TreeNode* Parent; // 부모 노드를 가리키는 포인터
vector<TreeNode*> children; // 자손 노드들을 가리키는 포인터의 배열
}
용도에 따라 다른 구조로도 만들 수 있다. 예를 들어, 이진 검색 트리는 왼쪽 오른쪽(left, right)에 최대 하나씩의 자식만을 가질 수 있게 만든다거나 등.
트리 순회 출력
// 주어진 트리의 각 노드에 저장된 값을 모두 출력한다.
void printLabels(TreeNode* root)
{
// 루트에 저장된 값을 출력한다.
cout << root->label << endl;
// 각 자손들을 루트로 하는 서브트리에 포함된 값들을 재귀적으로 출력한다.
for (int i = 0; i < root->children.size(); ++i)
printLabel(root->children[i]);
}
트리 높이 계산
// root를 루트로 하는 트리의 높이를 구한다.
int height(TreeNode* root)
{
int h = 0;
for (int i = 0; i < root->children.size(); ++i)
h = max(h, 1 + height(root->children[i]));
return h;
}