# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right classSolution: defgetMinimumDifference(self, root: Optional[TreeNode]) -> int: # 时间:遍历一遍树 On # 空间:最坏要递归n次,On # 利用了中序遍历是有序的特点,直接比较上个点与当前点,就相当于整个树排升序后两两比较 pre = -1e6 ans = 1e7 defdfs(root): ifnot root: return dfs(root.left) nonlocal ans, pre ans = min(ans, abs(pre-root.val)) pre = root.val dfs(root.right)
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right classSolution: defclosestNodes(self, root: Optional[TreeNode], queries: List[int]) -> List[List[int]]: # 时间:对于m个queries,每个都要从树上往下找,Omlogn # 空间:最坏要递归n次,On # 利用中序遍历构建有序数组,然后二分查找,稳定logn找到一对最近节点 ans = [] nums = []
defdfs(root): ifnot root: return dfs(root.left) nums.append(root.val) dfs(root.right) dfs(root) for q in queries: index = bisect_left(nums, q) if index == len(nums): ans.append([nums[-1], -1]) continue if index == 0and q < nums[index]: ans.append([-1, nums[0]]) continue if nums[index] == q: ans.append([q, q]) else: ans.append([nums[index-1], nums[index]]) return ans
# 下面错误做法尝试利用二叉搜索树的结构来实现,但是忽略了每次查询最坏情况退化成On,还是纯粹二分稳 ans = [] deffind_q(root): ifnot root: return nonlocal left_max, right_min if root.val == q: left_max, right_min = q, q elif root.val > q: right_min = min(right_min, root.val) if right_min != -1else root.val find_q(root.left) else: left_max = max(left_max, root.val) if left_max != -1else root.val find_q(root.right)
for q in queries: left_max, right_min = -1, -1 find_q(root) ans.append([left_max, right_min]) return ans
# Definition for a binary tree node. # class TreeNode: # def __init__(self, val=0, left=None, right=None): # self.val = val # self.left = left # self.right = right classSolution: defkthSmallest(self, root: Optional[TreeNode], k: int) -> int: # 时间:遍历部分树 Ok # 空间:最坏要递归k次,Ok # 利用中序遍历,找到第k个算值的 ans = 0 index = 0 defdfs(root): ifnot root: return dfs(root.left) # print(root.val) nonlocal index if index <= k: # 之所以还要=,是因为返回上面的时候也+1,使得上面的不能够覆盖ans index += 1 if index == k: nonlocal ans ans = root.val return dfs(root.right) dfs(root) return ans