Skip to content

Commit ab64323

Browse files
committed
kth-smallest-element-in-a-bst solution (py)
1 parent eb91f79 commit ab64323

File tree

1 file changed

+83
-0
lines changed

1 file changed

+83
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
# BSTμ—μ„œ k번째둜 μž‘μ€ valueλ₯Ό λ°˜ν™˜ν•΄λΌ
2+
# μΈλ±μŠ€λŠ” 1μ—μ„œ μ‹œμž‘
3+
4+
from typing import Optional
5+
6+
# Definition for a binary tree node.
7+
class TreeNode:
8+
def __init__(self, val=0, left=None, right=None):
9+
self.val = val
10+
self.left = left
11+
self.right = right
12+
13+
# 풀이 1. Sort
14+
# λͺ¨λ“  λ…Έλ“œμ˜ 값을 μ˜€λ¦„μ°¨μˆœμœΌλ‘œ μ •λ ¬ 후에 k번째 값을 κ΅¬ν•œλ‹€.
15+
# TC: O(N log N), N은 λ…Έλ“œμ˜ 개수, 트리 순회 O(N), μ •λ ¬ O(N log N)
16+
# SC: O(N), λͺ¨λ“  λ…Έλ“œμ˜ 값을 μ €μž₯ν•˜λŠ” 리슀트
17+
18+
class Solution:
19+
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
20+
values = []
21+
22+
def dfs(node):
23+
if not node:
24+
return
25+
26+
values.append(node.val)
27+
28+
dfs(node.left)
29+
dfs(node.right)
30+
31+
dfs(root)
32+
33+
return sorted(values)[k - 1]
34+
35+
# 풀이 2. νž™ ν™œμš©
36+
# k번째둜 μž‘μ€ κ°’ κ΅¬ν•˜κΈ° -> μ΅œλŒ€ νž™ ν™œμš©
37+
# - μš”μ†Œλ₯Ό -node.val 음수둜 λ³€ν™˜ν•΄ μ΅œλŒ€ νž™ 효과λ₯Ό λ‚Έλ‹€.
38+
# - μ΅œλŒ€ νž™μ— 값을 μΆ”κ°€ν•˜λ‹€κ°€, kκ°œκ°€ μ΄ˆκ³Όν•˜λ©΄ μ΅œλŒ€ νž™μœΌλ‘œλΆ€ν„° μ΅œλŒ“κ°’μ„ 제거
39+
# => 트리 순회 μ’…λ£Œ ν›„, μ΅œλŒ€ νž™μ—λŠ” κ°€μž₯ μž‘μ€ k개 κ°’λ§Œ λ‚¨κ²Œ λœλ‹€.
40+
# TC: O(N log K), N은 λ…Έλ“œμ˜ 개수, KλŠ” 찾고자 ν•˜λŠ” κ°’μ˜ μˆœμ„œ, 트리 순회 O(N), μ΅œλŒ€ νž™ μ‚½μž…/제거 O(logK)
41+
# SC: O(K), μ΅œλŒ€ k개의 값을 μ €μž₯ν•˜λŠ” μ΅œλŒ€ νž™
42+
43+
from heapq import heappush, heappop
44+
45+
class Solution:
46+
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
47+
heap = [] # μ΅œλŒ€ k개의 μž‘μ€ 값을 μ €μž₯ν•  μ΅œλŒ€ νž™
48+
49+
def dfs(node):
50+
if not node:
51+
return
52+
53+
heappush(heap, -node.val)
54+
if len(heap) > k:
55+
heappop(heap)
56+
57+
dfs(node.left)
58+
dfs(node.right)
59+
60+
dfs(root)
61+
62+
# νž™μ˜ μ΅œλŒ“κ°’μ΄ k번째둜 μž‘μ€ κ°’
63+
return -heap[0]
64+
65+
# 풀이 3. μ€‘μœ„ 순회 ν™œμš©
66+
# BSTλŠ” μ€‘μœ„ 순회λ₯Ό ν•˜λ©΄ μ˜€λ¦„μ°¨μˆœμœΌλ‘œ λ…Έλ“œμ— μ ‘κ·Όν•  수 μžˆλ‹€
67+
# => μž…λ ₯ 트리λ₯Ό μ€‘μœ„ 순회 ν•˜λ©΄μ„œ λ…Έλ“œ 값을 배열에 μ €μž₯ν•˜λ©΄ μžμ—°μŠ€λŸ½κ²Œ 배열은 정렬됨
68+
# TC: O(N), N은 λ…Έλ“œμ˜ 개수, 트리 순회 O(N)
69+
# SC: O(N), λͺ¨λ“  λ…Έλ“œμ˜ 값을 μ €μž₯ν•˜λŠ” 리슀트
70+
71+
class Solution:
72+
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
73+
values = []
74+
75+
def dfs(node):
76+
if not node:
77+
return
78+
dfs(node.left)
79+
values.append(node.val)
80+
dfs(node.right)
81+
82+
dfs(root)
83+
return values[k - 1]

0 commit comments

Comments
Β (0)