안녕하세요, 여러분! 오늘은 C#을 이용하여 알고리즘 문제를 해결하는 방법을 배워보겠습니다. 이번 주제는 이진 트리에서 리프 노드의 개수를 구하는 문제입니다. 이 문제를 풀면서 자료구조와 재귀 호출에 대한 이해도를 높일 수 있습니다.
1. 문제 정의
문제는 다음과 같습니다. 주어진 이진 트리가 있을 때, 리프 노드(자식 노드가 없는 노드)의 개수를 구하는 함수를 작성하시오.
예시
- 입력: 다음과 같은 이진 트리
1 / \ 2 3 / \ 4 5
2. 이진 트리 소개
이진 트리는 각 노드가 최대 두 개의 자식을 가지는 트리 데이터 구조입니다. 이진 트리는 다음과 같은 특성을 가지고 있습니다:
- 각 노드는 자식 노드(왼쪽 및 오른쪽)를 가질 수 있습니다.
- 리프 노드는 자식 노드가 없는 노드를 의미합니다.
- 이진 트리는 재귀적 구조를 가집니다.
3. 접근 방법
리프 노드의 개수를 구하기 위해 재귀 함수를 사용하는 방법을 고려해보겠습니다. 기본적인 접근 방식은 다음과 같습니다:
- 현재 노드를 판단합니다. 만약 현재 노드가 null이라면, 0을 반환합니다.
- 현재 노드가 리프 노드(즉, 왼쪽 자식과 오른쪽 자식 모두 null)인 경우, 1을 반환합니다.
- 현재 노드가 리프 노드가 아니라면, 왼쪽과 오른쪽 서브트리에서 각각 리프 노드의 개수를 재귀적으로 구한 후 합산하여 반환합니다.
4. C# 코드 구현
이제 위에서 설명한 접근 방법에 따라 C#으로 코드를 구현해보겠습니다.
using System; class TreeNode { public int Val; public TreeNode Left; public TreeNode Right; public TreeNode(int val) { Val = val; Left = null; Right = null; } } class Program { public static int CountLeafNodes(TreeNode root) { // 1. 현재 노드가 null인 경우 if (root == null) return 0; // 2. 현재 노드가 리프 노드인 경우 if (root.Left == null && root.Right == null) return 1; // 3. 왼쪽과 오른쪽 서브트리에서 리프 노드의 개수를 구함 return CountLeafNodes(root.Left) + CountLeafNodes(root.Right); } static void Main(string[] args) { // 트리 생성 TreeNode root = new TreeNode(1); root.Left = new TreeNode(2); root.Right = new TreeNode(3); root.Left.Left = new TreeNode(4); root.Left.Right = new TreeNode(5); // 리프 노드 개수 출력 int leafCount = CountLeafNodes(root); Console.WriteLine($"리프 노드의 개수: {leafCount}"); } }
5. 코드 설명
코드에서 제공된 TreeNode
클래스는 이진 트리의 노드를 정의합니다. 각 노드는 값(Val)과 왼쪽 자식 노드(Left), 오른쪽 자식 노드(Right)를 가집니다. CountLeafNodes
함수는 주어진 노드에 대한 리프 노드의 개수를 재귀적으로 계산합니다.
- 첫 번째 조건문에서 현재 노드가 null인 경우 0을 반환하여 종료합니다.
- 두 번째 조건문에서 현재 노드가 리프 노드인 경우 1을 반환합니다.
- 마지막으로, 왼쪽과 오른쪽 서브트리를 각각 방문하여 결과를 합산하여 반환합니다.
6. 시간 복잡도 분석
이 알고리즘의 시간 복잡도는 O(N)입니다. 여기서 N은 트리의 노드 개수를 나타냅니다. 각 노드를 한 번씩 방문하게 되므로, 선형 시간 복잡도를 가집니다.
7. 추가적인 고려사항
- 트리가 빈 경우, 즉 루트 노드가 null인 경우에는 리프 노드가 없습니다.
- 균형 이진 트리와 편향 이진 트리의 경우 모두 문제를 동일하게 처리할 수 있습니다.
8. 결론
이진 트리에서 리프 노드의 개수를 구하는 문제를 해결하는 방법을 배웠습니다. 재귀 함수를 사용하여 간단하게 해결할 수 있으며, 이 과정에서 트리 자료구조에 대한 이해도를 높일 수 있습니다.
다음 시간에는 다른 알고리즘 문제를 다루며 더 나아가겠습니다. 감사합니다!