LeetCode 230번: Kth Smallest Element in a BST(JAVA)

LeetCode 230번: Kth Smallest Element in a BST(JAVA)

문제출처 230번: Kth Smallest Element in a BST

❔ 문제


BST의 root 노드가 주어졌을 때, 이 트리의 k번째 작은 값을 출력.

⏩ 예시


Input: root = [5,3,6,2,4,null,null,1], k = 3 Output: 3

❕ 문제풀이


/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int count = 0;

    public int kthSmallest(TreeNode root, int k) {
        count = k; // 1.
        return inorder(root);
    }

    public int inorder(TreeNode node){
        if(node == null) return -1; // 2.


        int result = -1;
        result = inorder(node.left); // 3
        if(result != -1) return result; // 3.

        count--; // 4.
        if(count == 0) return node.val; // 5.
        
        return inorder(node.right); // 6.
    }
}
  1. k번째 작은 값을 찾기 위한 카운팅 인스턴수 변수를 초기화한다.
  2. 해당 노드가 null 이면 탐색이 더이상 불가하므로 -1을 반환한다.
  3. 중위 순회할 것이므로 왼쪽 노드부터 탐색한다. 만약 -1값이 아닌 값이 반환될 경우 그 값을 return 한다.
  4. 중위 순회 도중 만난 값은 최소값의 순서가 되므로 카운팅을 줄인다.
  5. 만약 카운트가 0이라면 k번째 작은 값이 되므로 해당 값을 return 한다.
  6. 중위 순회의 오른쪽 노드를 탐색하여 나온 값을 return 한다.

💯 고찰


BST를 DFS방식으로 순회하는 방법을 택하였다. 그 중에서도 최소값을 찾기 위해선 중위 순회를 해야한다고 판단하여 Solution에 이르렀다.

다른 여러 풀이도 결국 중위 순회 방식으로 O(N) 시간에 해결하고 있었다. 다만 DFS의 중단지점 설정이 각 코드마다 달랐었다. 나의 경우에는 return 값으로 판별했지만 인스턴스 변수나 클래스 변수를 별도로 두어 결과가 도출되었을 경우 return 해버리는 코드들이 많았다.