1. 二叉树算法精要解析
作为一名经历过多次算法面试洗礼的老兵,我深知二叉树在技术面试中的核心地位。DAY20的这组题目(530.二叉搜索树的最小绝对差、501.二叉搜索树中的众数、236.二叉搜索树的最近公共祖先)堪称二叉树算法的"黄金三题",涵盖了BST特性利用、遍历技巧和递归思维三大核心能力。
记得我在某次大厂面试中,面试官连续抛出这三道题的变体,当时就暗自庆幸曾经系统性地刷过这个组合。今天我就带大家深入剖析这三个经典问题,分享那些刷题攻略里不会告诉你的实战技巧。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 二叉搜索树的最小绝对差
2.1 问题本质与暴力解法
BST的最小绝对差问题看似简单,实则暗藏玄机。题目要求找到任意两节点值之差的最小绝对值,最直观的想法就是遍历所有节点对,计算差值后取最小值。这种方法时间复杂度是O(n²),对于BST来说简直是暴殄天物。
python复制# 暴力解法示例(仅用于对比理解)
def getMinimumDifference(root):
nodes = []
def dfs(node):
if not node: return
dfs(node.left)
nodes.append(node.val)
dfs(node.right)
dfs(root)
return min(abs(a-b) for i,a in enumerate(nodes) for j,b in enumerate(nodes) if i!=j)
2.2 利用BST特性的最优解
BST的中序遍历性质才是解题关键。中序遍历BST会得到一个严格递增的序列,最小差值必然出现在相邻元素之间。这个认知将问题复杂度直接降到O(n)。
python复制def getMinimumDifference(root):
prev = float('-inf')
min_diff = float('inf')
def inorder(node):
nonlocal prev, min_diff
if not node: return
inorder(node.left)
min_diff = min(min_diff, node.val - prev)
prev = node.val
inorder(node.right)
inorder(root)
return min_diff
关键技巧:使用nonlocal变量在递归中维护状态,避免全局变量污染。prev初始设为负无穷,确保第一个节点的差值计算不会影响结果。
2.3 迭代实现与空间优化
递归解法虽然直观,但在实际工程中可能面临栈溢出风险。以下是更安全的迭代实现:
python复制def getMin
