알고리즘/LeetCode
LeetCode 230. Kth Smallest Element in a BST (python)
Timha
2023. 9. 7. 17:53
Given the root of a binary search tree, and an integer k, return the kth smallest value (1-indexed) of all the values of the nodes in the tree.
풀이
이진트리에서 k번째로 작은 숫자를 반환하는 문제이다. (인덱스 1 부터시작)
BST트리에서 오름차순으로 순화하기위해서는 중위순회를 하면 된다.
방법
1. 중위순회를 통해서 가장 작은 값에서부터 탐색을 시작해서 탐색마다 K의 값을 1씩 빼줘서 (K = K-1) 0이되면 현재 노드의 값 반환시키기
2. 리스트를 만들어서 중위순회를 통해 값을 리스트에 담아서 리스트의 K-1번째 인덱스 반환
BST트리가 중위순회를 통해 탐색한다면 최소값부터 순회한다는걸 알면 쉬운 문제이다.
코드
1. 중위순회 반복분 (k를 차감하며 탐색)
# 재귀로 탐색
class Solution(object):
def kthSmallest(self, root, k):
self.cnt = k
self.result = None
self.find(root)
return self.result
def find(self,node): # 트리의 왼쪽아래 (DETH가 제일 깊은 왼쪽) 탐색
if node is None: # node가 None이라면 반환
return
self.find(node.left) # 왼쪽탐색 재귀 (왼쪽끝까지 간 후 탐색 시작)
self.cnt-=1 # k를 cnt로 값을 1씩 차감
if self.cnt == 0: # cnt가 0이 된다면 오름차순정렬시 k번째 인덱스의 숫자
self.result = node.val
return
self.find(node.right)
2. 중위순회하며 찾은 값들을 리스트에 넣고, 리스트의 [k-1]번째 인덱스를 반환하는 방법
# 리스트로 찾기
class Solution(object):
def kthSmallest(self, root, k):
self.result = []
self.find(root)
return self.result[k-1]
def find(self,node):
if node is None: # none이라면 반환
return
self.find(node.left) # depth가 제일 깊은 왼쪽 노드로 재귀를 통해 탐색 (맨 왼쪽노드부터 탐색시작)
self.result.append(node.val) # 찾은 값 추가해주기,
self.find(node.right) # 왼쪽 현재 오른쪽 탐색,
위와 동일하게 재귀문으로 왼쪽 뎁스의 가장 깊은 곳부터 탐색을 시작하며 값들을 모두 리스트에 담고
리스트[k-1]번째 인덱스의 값을 반환해준다.
다른사람의 코드
class Solution:
def kthSmallest(self, root: TreeNode, k: int) -> int:
stack = []
res = []
while stack or root:
while root:
stack.append(root)
root = root.left
root = stack.pop()
res.append(root)
root = root.right
return res[k-1].val
두개의 스택을만들고 root에서 왼쪽을 wihle문으로 먼저 뽑아서 스택에 넣어준 뒤, 오른쪽 값을 찾아서 번갈아가면서 정렬해준다, - 최종적으로 오름차순정렬된 수열의 리스트가 만들어짐,
그다음 k번쨰-1 인덱스 값을 리턴하여 값을 찾는다.