namespace Tree
{
class TreeNode<T>
{
public T Data { get; set; } // 노드가 저장하는 데이터
public List<TreeNode<T>> Children { get; set; } = new List<TreeNode<T>>(); // 자식 노드 목록
}
internal class Program
{
// 노드 기반으로 구현
// 따로 라이브러리를 제공하지 않음
static TreeNode<string> MakeTree()
{
TreeNode<string> root = new TreeNode<string>() { Data = "R1 개발실" };
{
TreeNode<string> node1 = new TreeNode<string>() { Data = "디자인팀" };
node1.Children.Add(new TreeNode<string>() { Data = "전투" });
node1.Children.Add(new TreeNode<string>() { Data = "경제" });
node1.Children.Add(new TreeNode<string>() { Data = "스토리" });
root.Children.Add(node1);
}
{
TreeNode<string> node2 = new TreeNode<string>() { Data = "프로그래밍팀" };
node2.Children.Add(new TreeNode<string>() { Data = "서버" });
node2.Children.Add(new TreeNode<string>() { Data = "클라" });
node2.Children.Add(new TreeNode<string>() { Data = "엔진" });
root.Children.Add(node2);
}
{
TreeNode<string> node3 = new TreeNode<string>() { Data = "아트팀" };
node3.Children.Add(new TreeNode<string>() { Data = "배경" });
node3.Children.Add(new TreeNode<string>() { Data = "캐릭터" });
root.Children.Add(node3);
}
return root;
}
// 재귀 함수로 구현
static void PrintTree(TreeNode<string> root)
{
// 접근
Console.WriteLine(root.Data);
foreach (TreeNode<string> child in root.Children) PrintTree(child);
}
static void PrintTree(TreeNode<string> root, int depth = 0)
{
Console.WriteLine(new string(' ', depth * 2) + root.Data);
foreach (TreeNode<string> child in root.Children)
{
PrintTree(child, depth + 1);
}
}
// 트리의 높이 구하기
static int GetHeight(TreeNode<string> root)
{
int height = 0;
foreach (TreeNode<string> child in root.Children)
{
// 원래코드
//int newHeight = GetHeight(child) + 1;
//if (height < newHeight) height = newHeight;
height = Math.Max(height, GetHeight(child) + 1);
}
return height;
}
static void Main(string[] args)
{
TreeNode<string> root = MakeTree();
PrintTree(root);
Console.WriteLine($"트리의 높이: {GetHeight(root)}");
}
}
}
디버깅으로 확인

순회

트리(Tree)는 계층적 데이터 구조를 표현하는 비선형 자료구조입니다. 루트 노드(root node)를 기준으로 부모-자식 관계를 가지며, 순환(cycle)이 없는 구조입니다.
트리를 구현하기 위해 제네릭 클래스를 활용하여 트리 노드를 생성합니다.
TreeNode<T>)using System;
using System.Collections.Generic;
namespace TreeExample
{
class TreeNode<T>
{
public T Data { get; set; } // 노드가 저장하는 데이터
public List<TreeNode<T>> Children { get; set; } = new List<TreeNode<T>>(); // 자식 노드 목록
}
}
TreeNode<T> 클래스 설명T를 활용Data):Children):List<TreeNode<T>>를 사용하여 여러 개의 자식 노드를 가질 수 있도록 설정new List<TreeNode<T>>())트리를 생성하는 메서드 MakeTree()를 작성합니다.
MakeTree)static TreeNode<string> MakeTree()
{
TreeNode<string> root = new TreeNode<string>() { Data = "R1 개발실" };
{
TreeNode<string> node1 = new TreeNode<string>() { Data = "디자인팀" };
node1.Children.Add(new TreeNode<string>() { Data = "전투" });
node1.Children.Add(new TreeNode<string>() { Data = "경제" });
node1.Children.Add(new TreeNode<string>() { Data = "스토리" });
root.Children.Add(node1);
}
{
TreeNode<string> node2 = new TreeNode<string>() { Data = "프로그래밍팀" };
node2.Children.Add(new TreeNode<string>() { Data = "서버" });
node2.Children.Add(new TreeNode<string>() { Data = "클라" });
node2.Children.Add(new TreeNode<string>() { Data = "엔진" });
root.Children.Add(node2);
}
{
TreeNode<string> node3 = new TreeNode<string>() { Data = "아트팀" };
node3.Children.Add(new TreeNode<string>() { Data = "배경" });
node3.Children.Add(new TreeNode<string>() { Data = "캐릭터" });
root.Children.Add(node3);
}
return root;
}
MakeTree() 메서드 설명root 노드: "R1 개발실" (트리의 최상위 노드)"디자인팀": "전투", "경제", "스토리""프로그래밍팀": "서버", "클라", "엔진""아트팀": "배경", "캐릭터"트리의 모든 데이터를 출력하기 위해 재귀 함수를 활용합니다.
PrintTree)static void PrintTree(TreeNode<string> root, int depth = 0)
{
Console.WriteLine(new string(' ', depth * 2) + root.Data);
foreach (TreeNode<string> child in root.Children)
{
PrintTree(child, depth + 1);
}
}
PrintTree() 메서드 설명depth 인자를 사용하여 계층 구조를 표현 (new string(' ', depth * 2))R1 개발실
디자인팀
전투
경제
스토리
프로그래밍팀
서버
클라
엔진
아트팀
배경
캐릭터
트리의 높이를 계산하는 메서드를 구현합니다.
GetHeight)static int GetHeight(TreeNode<string> root)
{
int height = 0;
foreach (TreeNode<string> child in root.Children)
{
height = Math.Max(height, GetHeight(child) + 1);
}
return height;
}
GetHeight() 메서드 설명height를 업데이트0을 반환트리의 높이: 2
"디자인팀", "프로그래밍팀", "아트팀"까지가 depth = 1"전투", "경제", "스토리" 등은 depth = 22가 됨Main() 메서드 - 실행 부분class Program
{
static void Main(string[] args)
{
TreeNode<string> root = MakeTree();
PrintTree(root);
Console.WriteLine($"트리의 높이: {GetHeight(root)}");
}
}
MakeTree()를 호출하여 트리 생성PrintTree(root)를 호출하여 트리의 구조 출력GetHeight(root)를 호출하여 트리의 높이 계산 및 출력TreeNode<T> 클래스를 이용하여 제네릭 트리 구조를 구현MakeTree)"R1 개발실"을 루트로 하는 조직도 형태의 트리 생성PrintTree)GetHeight)R1 개발실
디자인팀
전투
경제
스토리
프로그래밍팀
서버
클라
엔진
아트팀
배경
캐릭터
트리의 높이: 2