반응형
문제
Kth Smallest Element in a BST - LeetCode
문제 해결 방법
-이진 트리에서 K번째 노드를 출력받는 문제입니다.
-이진트리에서 작은수에서 큰수대로 출력하는 방법은 DFS-inorder입니다.
-DFS, inorder를 k만큼 반복한후 출력합니다
-다른 노드의 값이 필요하지 않으므로, 재귀함수가 아닌 그냥 반복문을 사용합니다.
-Follow up: 이진트리는 기본적으로 검색에 빠르고 수정이 느리므로, 이진트리말고 다른 데이터 스트럭쳐를 쓰는것이 좋습니다. 하지만 반드시 이진트리를 써야한다면,
- 트리노드를 LinkedList가 아닌 Double Linked List로 구현
- 값이 아닌 노드를 반환
- 새로운 값을 insert
- 이미 가지고 있는 노드에서 이전 노드의 값(새로운 값)을 출력
시간복잡도: O(n), 공간복잡도: O(n)
https://github.com/eunhanlee/LeetCode230..KthSmallestElementinaBST.git
public class Solution {
/**
* 이진 트리에서 k번째로 작은 값을 찾아 반환합니다.
*
* @param root 이진 트리의 루트 노드
* @param k 찾을 k번째 값
* @return k번째로 작은 값
*/
public int kthSmallest(TreeNode root, int k) {
int counter = 0; // 현재까지 방문한 노드의 수를 저장
int value = -1; // 반환할 k번째로 작은 값, 찾지 못하면 -1을 반환
if (root == null) {
return value; // 빈 트리인 경우 기본 값인 -1을 반환
}
Deque<TreeNode> stack = new LinkedList<>(); // 스택으로 사용할 덱 생성
TreeNode current = root;
while (current != null || !stack.isEmpty()) {
while (current != null) {
stack.push(current); // 왼쪽 자식을 탐색하기 위해 스택에 현재 노드를 추가
current = current.left;
}
current = stack.pop(); // 스택에서 가장 위의 노드를 팝하여 현재 노드로 설정
counter++;
value = current.val; // 현재 노드의 값을 저장
if (counter == k) break; // 카운터 값이 k와 같다면 반복문 종료
current = current.right; // 오른쪽 자식으로 이동하여 탐색 계속 진행
}
return value; // k번째로 작은 값 반환
}
}
반응형
'old > Algorithm Solving' 카테고리의 다른 글
LeetCode 131. Palindrome Partitioning 자바 문제 풀이 (0) | 2023.07.02 |
---|---|
Geek's Village and Wells 문제의 자바 해결 방법: 효율적인 알고리즘 (0) | 2023.07.02 |
LeetCode 238. Product of Array Except Self 자바 문제 풀이 (0) | 2023.06.28 |
LeetCode 215. Kth Largest Element in an Array 자바 문제 풀이 (0) | 2023.06.22 |
LeetCode 1108. Defanging an IP Address 자바 문제 풀이 (0) | 2023.06.18 |