Kth Smallest Element in a BST
The problem description can be found in LeetCode.
Approach
Since we are looking for the k-th smallest element
in a Binary Search Tree, the smallest ones are on the left side.
In particular, if we follow the In-order traversal, we would get an ordered list of values.
In this traversal, the order is:
- Left.
- Node.
- Right.
We can use the 2. step to check the value of the node and
keep track of the answer in a global variable,
which we can update as soon as we found the k-th smallest element.
Here, we can either start from k and go until 0 (as implemented) or
start from 0 and go until k.
Solution
from typing import Optional
class Solution:
def kthSmallest(self, root: Optional[TreeNode], k: int) -> int:
def dfs(node: Optional[TreeNode]) -> None:
nonlocal ans
nonlocal i
if not node:
return
dfs(node.left)
i -= 1
if i == 0:
ans = node.val
else:
dfs(node.right)
ans = -1
i = k
dfs(root)
assert ans != -1, "expected one solution"
return ans
Complexity
- Time:
- Space:
Where is the number of nodes in the tree and is its height. If the tree is unbalanced, it is like having a Linked List, hence .