호빵의 IT 개발소

[C#] 트리 구현 연습 본문

자료구조와 알고리즘/자료구조와 알고리즘 맛보기

[C#] 트리 구현 연습

호빵Stack 2022. 1. 15. 18:16

예시를 프로그래밍 구현 연습을 하겠습니다.

 - 트리구현

 - 콘솔창으로 트리 출력

 - 트리의 높이 구하기

1) 트리 구현

using System;
using System.Collections.Generic;
using System.Text;

namespace Exercise
{ 
    class TreeNode<T> //어떤 정점 노드가 있다.
    {
        public T Data { get; set; } //데이터를 가지고 있고
        public List<TreeNode<T>> Children { get; set; } = new List<TreeNode<T>>(); //연결된 자식들이 있다.
    }
    class Program
    {
        static TreeNode<string> MakeTree()
        {
            TreeNode<string> root = new TreeNode<string>() { Data = "개발실" }; //최상위 노드
            {
                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "디자인팀" }; //개발실의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "전투" }); //디자인팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "경제" }); //디자인팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "스토리" }); //디자인팀의 자식 노드
                    root.Children.Add(node); //root에 연결
                }

                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "프로그래밍팀" }; //개발실의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "서버" }); //프로그래밍팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "클라" }); //프로그래밍팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "엔진" }); //프로그래밍팀의 자식 노드
                    root.Children.Add(node);
                }

                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "아트팀" }; //개발실의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "배경" }); //아트팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "캐릭터" }); //아트팀의 자식 노드
                    root.Children.Add(node);
                }
            }
            return root; 
        }

        static void Main(string[] args)
        {
            TreeNode<string> root = MakeTree();
        }
    }
}

 

2) 콘솔창으로 트리 출력

using System;
using System.Collections.Generic;
using System.Text;

namespace Exercise
{ 
    class TreeNode<T> //어떤 정점 노드가 있다.
    {
        public T Data { get; set; } //데이터를 가지고 있고
        public List<TreeNode<T>> Children { get; set; } = new List<TreeNode<T>>(); //연결된 자식들이 있다.
    }
    class Program
    {
        static TreeNode<string> MakeTree()
        {
            TreeNode<string> root = new TreeNode<string>() { Data = "개발실" }; //최상위 노드
            {
                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "디자인팀" }; //개발실의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "전투" }); //디자인팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "경제" }); //디자인팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "스토리" }); //디자인팀의 자식 노드
                    root.Children.Add(node); //root에 연결
                }

                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "프로그래밍팀" }; //개발실의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "서버" }); //프로그래밍팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "클라" }); //프로그래밍팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "엔진" }); //프로그래밍팀의 자식 노드
                    root.Children.Add(node);
                }

                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "아트팀" }; //개발실의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "배경" }); //아트팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "캐릭터" }); //아트팀의 자식 노드
                    root.Children.Add(node);
                }
            }
            return root; 
        }
        
        static void PrintTree(TreeNode<string> root) //재귀함수
        {
            //현재 데이터를 접근해서 출력한다.
            Console.WriteLine(root.Data);

            //자식한테도 하나하나 명령을 내린다.
            foreach (TreeNode<string> child in root.Children)
                PrintTree(child);
        }
        
        static void Main(string[] args)
        {
            TreeNode<string> root = MakeTree();

            PrintTree(root);
        }
    }
}

출력

 

3) 트리의 높이 출력

using System;
using System.Collections.Generic;
using System.Text;

namespace Exercise
{ 
    class TreeNode<T> //어떤 정점 노드가 있다.
    {
        public T Data { get; set; } //데이터를 가지고 있고
        public List<TreeNode<T>> Children { get; set; } = new List<TreeNode<T>>(); //연결된 자식들이 있다.
    }
    class Program
    {
        static TreeNode<string> MakeTree()
        {
            TreeNode<string> root = new TreeNode<string>() { Data = "개발실" }; //최상위 노드
            {
                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "디자인팀" }; //개발실의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "전투" }); //디자인팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "경제" }); //디자인팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "스토리" }); //디자인팀의 자식 노드
                    root.Children.Add(node); //root에 연결
                }

                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "프로그래밍팀" }; //개발실의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "서버" }); //프로그래밍팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "클라" }); //프로그래밍팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "엔진" }); //프로그래밍팀의 자식 노드
                    root.Children.Add(node);
                }

                {
                    TreeNode<string> node = new TreeNode<string>() { Data = "아트팀" }; //개발실의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "배경" }); //아트팀의 자식 노드
                    node.Children.Add(new TreeNode<string>() { Data = "캐릭터" }); //아트팀의 자식 노드
                    root.Children.Add(node);
                }
            }
            return root; 
        }

        static void PrintTree(TreeNode<string> root) //재귀함수
        {
            //현재 데이터를 접근해서 출력한다.
            Console.WriteLine(root.Data);

            //자식한테도 하나하나 명령을 내린다.
            foreach (TreeNode<string> child in root.Children)
                PrintTree(child);
        }

        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; //새로운 높이가 현재높이가 된다.
            }    

            return height;
        }

        static void Main(string[] args)
        {
            TreeNode<string> root = MakeTree();

           Console.WriteLine(GetHeight(root));
        }
    }
}

출력

 

 

 

---------------------------------------------------------------------------------------------------------------------------

참고 : [인프런] Rookiss님의 [C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part2: 자료구조와 알고리즘

Comments