Computer >> 컴퓨터 >  >> 프로그래밍 >> C++

C++로 이진 트리의 왼쪽 리프 노드 합 구하기

문제 개요

루트 노드와 왼쪽 자식, 오른쪽 자식을 가진 하나의 이진 트리(Binary Tree)가 있다고 가정해 보겠습니다. 이때 구해야 할 값은 부모 노드의 왼쪽 자식 위치에 있는 리프(잎) 노드들의 데이터 총합입니다.

예시

입력:

C++로 이진 트리의 왼쪽 리프 노드 합 구하기

출력:

15

설명: 주어진 이진 트리에서 부모의 왼쪽에 위치한 리프 노드는 9, 4, 2이며, 이들의 합은 9 + 4 + 2 = 15입니다. 따라서 출력값은 15가 됩니다.

문제 해결 접근 방법

이 문제는 재귀(Recursion)를 활용하면 간단하게 해결할 수 있습니다. 핵심 아이디어는 현재 노드의 왼쪽 자식이 존재하는지 먼저 확인하고, 그 왼쪽 자식이 더 이상 자식을 가지지 않는다면(즉, 리프 노드라면) 해당 노드의 값을 결과에 더하는 것입니다. 이후 오른쪽 서브트리에 대해서도 같은 과정을 재귀적으로 반복하면 전체 트리를 한 번의 순회로 처리할 수 있습니다.

알고리즘 단계

  • 루트 노드와 왼쪽·오른쪽 자식을 가진 이진 트리를 입력으로 받습니다.
  • 정수형 함수 leftLeafSum(treenode* root)는 루트 노드를 입력받아 부모의 왼쪽에 위치한 모든 리프 노드의 합을 반환합니다.
  • 루트 노드가 NULL이면 0을 반환합니다.
  • 루트 노드의 왼쪽 자식이 존재하고 그 자식이 리프 노드라면, 해당 노드의 값을 더한 뒤 오른쪽 서브트리를 재귀적으로 탐색합니다.
  • 그 외의 경우에는 왼쪽 자식과 오른쪽 자식 각각에 대해 재귀적으로 합을 구해 더한 값을 반환합니다.

C++ 구현 코드

#include <bits/stdc++.h>
using namespace std;

struct treenode {
    int data;
    treenode *left;
    treenode *right;
};

struct treenode* createNode(int d) {
    struct treenode* root = new treenode;
    root->data = d;
    root->left = NULL;
    root->right = NULL;
    return root;
}

int leftLeafSum(treenode* root) {
    if (root == NULL)
        return 0;

    // 왼쪽 자식이 존재하고, 그 자식이 리프 노드인 경우
    if (root->left && !root->left->left && !root->left->right)
        return root->left->data + leftLeafSum(root->right);

    return leftLeafSum(root->left) + leftLeafSum(root->right);
}

int main() {
    struct treenode* root = NULL;
    root = createNode(4);
    root->left = createNode(2);
    root->right = createNode(2);
    root->left->right = createNode(7);
    root->left->left = createNode(5);
    root->right->left = createNode(5);
    root->right->right = createNode(7);

    int sum = leftLeafSum(root);
    cout << sum << endl;
    return 0;
}

위 코드를 실행하면 다음과 같은 결과가 출력됩니다.

출력

10

설명: 이 예제에서 부모의 왼쪽 자식 위치에 있으면서 자식을 가지지 않는 노드는 값이 5인 두 노드뿐입니다. 따라서 왼쪽 리프 노드의 합은 5 + 5 = 10이 됩니다.

복잡도 분석

  • 시간 복잡도: O(n) — 트리의 모든 노드를 한 번씩 방문합니다. (n은 전체 노드 수)
  • 공간 복잡도: O(h) — 재귀 호출 스택이 트리의 높이(h)만큼 사용됩니다. 트리가 한쪽으로 치우친 편향 트리일 경우 O(n)까지 증가할 수 있습니다.