넘치게 채우기

[LeetCode] 988. Smallest String Starting From Leaf 본문

PS/LeetCode

[LeetCode] 988. Smallest String Starting From Leaf

riveroverflow 2024. 4. 17. 13:30
728x90
반응형

 

https://leetcode.com/problems/smallest-string-starting-from-leaf/description/

Leetcode - Smallest String Starting From Leaf

문제 유형 : 이진트리, 재귀, dfs

문제 난이도 : Medium

 

문제

You are given the root of a binary tree where each node has a value in the range [0, 25] representing the letters 'a' to 'z'.

Return the lexicographically smallest string that starts at a leaf of this tree and ends at the root.

As a reminder, any shorter prefix of a string is lexicographically smaller.

  • For example, "ab" is lexicographically smaller than "aba".

A leaf of a node is a node that has no children.

 

이진트리의 루트가 주어집니다. 노드의 값은 0~25까지 있습니다. a부터 z까지를 의미합니다.

 

트리의 잎 노드 -> 루트 노드까지의 경로의 문자열들 중, 사전순으로 가장 먼저 오는 문자열을 구하시오.

예를 들면, ab는 aba보다 앞입니다.

 

풀이

순회하는 재귀 함수의 파라미터로, 서브트리의 root와 현재 root를 포함하는 최상위 root -> 현재 서브트리 root까지 만들어진 문자열을 사용합니다.

만약 현재가 리프노드라면, 파라미터의 문자열을 뒤집어서 반환합니다.

아니라면, 서브트리를 더 내려가면서,

왼쪽과 오른쪽 각각 순회한 뒤, 사전순으로 더 작은 반환값을 반환시킵니다.

 

코드

C++

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    string solve(TreeNode* root, string str) {
        if(root -> left == NULL && root -> right == NULL) {
            reverse(str.begin(), str.end());
            return str;
        }

        string left = "";
        string right = "";

        if(root -> left) {
            char leftch = root -> left -> val + 'a';
            left = solve(root -> left, str + leftch);
        }
        
        if(root -> right) {
            char rightch = root -> right -> val + 'a';
            right = solve(root -> right, str + rightch);
        }

        if(left == "") return right;
        else if(right == "") return left;

        if(left < right) return left;
        return right;
    }
    string smallestFromLeaf(TreeNode* root) {
        char ch = 'a' + root -> val;
        string str = "";
        return solve(root, str + ch);
    }
};

 

728x90
반응형

'PS > LeetCode' 카테고리의 다른 글

[LeetCode] 200. Number of Islands  (0) 2024.04.19
[LeetCode] 463. Island Perimeter  (0) 2024.04.18
[LeetCode] 623. Add One Row to Tree  (0) 2024.04.16
[LeetCode] 129. Sum Root to Leaf Numbers  (0) 2024.04.15
[LeetCode] 404. Sum of Left Leaves  (0) 2024.04.14