문제
- 문제 링크
- 이진 트리
root
가 주어진다. 각 노드는 [0, 25]
범위의 값을 가진다. 그리고 각 값은 ['a', 'z']
에 대응된다. leaf 노드에서 root로 이어지는 문자열 중에, 사전적으로 가장 작은 문자열을 구해야 한다. leaf 노드는 자식 노드를 가지고 있지 않은 노드이다.
- 제약 조건
- 예시

풀이
풀기 전
- 경로에 있는 문자를 모두 저장하면서 노드를 탐색해야 한다. 그리고 leaf를 만났을 때 완성된 문자열이 사전적으로 가장 작은지 확인하면 된다.
- 헷갈릴 수 있는 건 문자열을 만들 때 root로 시작하는 게 아니라, leaf로 시작한다는 거다.
코드
class Solution {
private String ans = "";
private void traverse(TreeNode node, StringBuilder sb) {
if (node == null)
return;
sb.insert(0, (char) (node.val + 'a'));
if (node.left == null && node.right == null) {
String now = sb.toString();
if (ans == "" || ans.compareTo(now) > 0)
ans = now;
sb.deleteCharAt(0);
return;
}
traverse(node.left, sb);
traverse(node.right, sb);
sb.deleteCharAt(0);
}
public String smallestFromLeaf(TreeNode root) {
traverse(root, new StringBuilder());
return ans;
}
}
푼 후
- 트리 탐색은 익숙했는데, 문자열 다루는 게 헷갈렸다.
- 모든 노드를 한 번씩 탐색하기 때문에 총 노드 개수를 n이라고 하면
시간 복잡도는 O(n)
이다. 공간 복잡도는 재귀 함수의 깊이로 구할 수 있는데, 트리가 한 쪽으로만 길면 노드의 개수만큼 깊이를 갖기 때문에 공간 복잡도는 O(n)
이다.