270. Closest Binary Search Tree Value
270. Closest Binary Search Tree Value
這個題目被標記為簡單是因為這個題目存在著一個簡單的解法,但是這個題目存在一個更優解,這個更優解就很難想得到。
簡單的解法是,既然這是一個 BST ,如果透過中序遍歷,就能依照順序列出所有的數字,這樣只要在重新掃描一次,就能得到題目所要求的最接近的值
class Solution:
def closestValue(self, root: Optional[TreeNode], target: float) -> int:
if not root:
return 0
res = []
def traverse(node):
if not node:
return
traverse(node.left)
res.append(node.val)
traverse(node.right)
traverse(root)
if len(res) == 1:
return root.val
for i in range(1, len(res)):
if res[i] > target:
return res[i] if abs(res[i] - target) < abs(res[i-1] - target) else res[i - 1]
elif res[i] == target:
return res[i]
# target 遠大於所有值
return res[-1]
這樣的做法時間跟空間複雜度都為 \(O(n)\) 。
class Solution:
def closestValue(self, root: Optional[TreeNode], target: float) -> int:
def dfs(node, closest):
if not node:
return closest # 遇到 None 時返回當前的最接近值
# 如果 `node.val` 比 `closest` 更接近 target,更新 `closest`
# 如果距離一樣,選擇較小的值
if abs(node.val - target) < abs(closest - target) or \
(abs(node.val - target) == abs(closest - target) and node.val < closest):
closest = node.val
# 根據 BST 特性,決定搜索方向
if target < node.val:
return dfs(node.left, closest) # 往左子樹搜尋
else:
return dfs(node.right, closest) # 往右子樹搜尋
return dfs(root, root.val) # 初始化 `closest` 為 root.val