[c++] 이진 탐색 트리에서 k번째로 작은 요소(Kth Smallest Element in a BST)
이진 탐색 트리(Binary Search Tree)에서 k번째로 작은 요소를 찾는 문제는 중위 순회(Inorder Traversal)를 활용하여 해결할 수 있습니다. 중위 순회는 트리를 왼쪽 서브트리, 루트 노드, 오른쪽 서브트리 순서로 방문하여 노드 값을 읽는 방식입니다. 중위 순회를 사용하면 노드들을 오름차순으로 방문할 수 있기 때문에 k번째로 작은 요소를 쉽게 찾을 수 있습니다.
문제 설명
주어진 이진 탐색 트리의 루트 노드와 자연수 k가 주어졌을 때, 해당 트리에서 k번째로 작은 요소를 찾아 반환하는 문제입니다.
중위 순회를 활용한 해결 방법
이 문제를 해결하기 위해 중위 순회로 BST를 순회하면서 순회한 노드의 값을 기록하고 k번째로 작은 값을 반환하면 됩니다.
다음은 C++로 작성된 중위 순회를 활용한 이진 탐색 트리에서 k번째로 작은 요소를 찾는 예제 코드입니다.
// 이진 탐색 트리 노드 정의
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
int kthSmallest(TreeNode* root, int k) {
stack<TreeNode*> s;
TreeNode* p = root;
int count = 0;
while (p != NULL || !s.empty()) {
if (p != NULL) {
s.push(p);
p = p->left;
} else {
p = s.top();
s.pop();
count++;
if (count == k) {
return p->val;
}
p = p->right;
}
}
return -1; // k번째로 작은 요소가 없을 경우 예외 처리
}
};
이 코드는 중위 순회를 스택을 활용하여 구현한 예제로, BST를 순회하면서 k번째로 작은 요소를 반환합니다.
마치며
이와 같이 중위 순회를 활용하여 이진 탐색 트리에서 k번째로 작은 요소를 찾을 수 있습니다. 이러한 방식을 활용하여 효율적으로 BST를 탐색하고 원하는 요소를 찾아낼 수 있습니다.
참고 문헌: LeetCode - Kth Smallest Element in a BST