LeetCode - Kth Smallest Element in a BST(二元搜尋樹中的第 K 小元素)
題目描述
給定一棵二元搜尋樹(BST)和一個整數 k
,找出該樹中的第 k
小的元素。
範例:
1
2
3
4
5
輸入:root = [3,1,4,null,2], k = 1
輸出:1
輸入:root = [5,3,6,2,4,null,null,1], k = 3
輸出:3
限制:
- 樹中節點的數量範圍是
[1, 10^4]
。 - 每個節點的值都是唯一的,且都為正數。
k
的值總是有效的,即1 <= k <=
樹中節點的數量。
解法思路
利用 BST 的性質進行中序遍歷,因為中序遍歷 BST 會得到一個遞增的序列。只需在遍歷過程中計數,找到第 k
個節點即為所求的第 k
小元素。
中序遍歷解法
- 使用遞歸或迭代方式進行中序遍歷。
- 計數當前遍歷的節點數,當計數到
k
時,返回當前節點的值。
範例代碼
以下是中序遍歷的 Python 實現:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def kthSmallest(root, k):
stack = []
current = root
count = 0
# 使用迭代的中序遍歷
while stack or current:
# 先遍歷左子樹
while current:
stack.append(current)
current = current.left
# 處理當前節點
current = stack.pop()
count += 1
# 如果當前計數等於 k,則返回當前節點值
if count == k:
return current.val
# 遍歷右子樹
current = current.right
代碼解析
- 迭代中序遍歷:利用堆疊(
stack
)模擬遞歸,進行中序遍歷。 - 計數:每次彈出節點時計數,當計數達到
k
時,返回當前節點的值。
時間和空間複雜度
- 時間複雜度:O(H + k),其中
H
是樹的高度。最壞情況下,可能遍歷至最深的節點,因此複雜度為O(N)
。 - 空間複雜度:O(H),其中
H
是堆疊的深度。
本文章以 CC BY 4.0 授權