题目描述
思路解析动画文字版
下面 9 步动画会按主解代码推进,而不是泛泛讲题型。
1. 读入 BST:示例 BST [4,2,6,1,3]:根 4,左 2(子 1、3),右 6。BST 中序遍历得到升序 1,2,3,4,6,最小差只会出现在相邻两个节点之间。
2. 初始化 prev,ans:初始化:prev=None(还没有前驱),ans=∞。开始中序遍历,每访问一个节点就和它的前驱比一次差。
3. 中序 → 1:中序第一个访问到最左节点 1。它没有前驱可比,把 prev 记为 1,ans 仍是 ∞。
4. 中序 → 2:中序到 2:diff = 2 − prev(1) = 1,更新 ans=1。prev 记为 2。
5. 中序 → 3:中序到 3:diff = 3 − prev(2) = 1,ans 仍是 1。prev 记为 3。
6. 中序 → 4(根):中序到根 4:diff = 4 − prev(3) = 1,ans 仍是 1。prev 记为 4。
7. 中序 → 6:中序到 6:diff = 6 − prev(4) = 2,比 1 大,ans 不变=1。prev 记为 6。
8. 遍历结束:中序遍历结束,相邻差里最小的是 1,ans=1。
9. 返回答案:返回 1。最小差来自中序相邻节点,全程 O(n) 时间、O(h) 递归栈空间。
记住这题的代码骨架:题意约束先落到状态变量,再用循环或递归维护它。
参考代码
class Solution: def getMinimumDifference(self, root): prev = None ans = float('inf') def inorder(node): nonlocal prev, ans if not node: return inorder(node.left) if prev is not None: ans = min(ans, node.val - prev) prev = node.val inorder(node.right) inorder(root) return ans复杂度
- 时间复杂度:O(n),中序遍历
- 空间复杂度:O(h),递归栈
易错点
这道题到这就讲完了。动画和文字是同一套思路——别光看,关掉页面自己默写一遍。然后顺着主线继续:
二叉树的直径
LeetCode 543 · 简单 · 沿着 二叉树套路 继续往下推进
把这道题真正学会,再走
图解算法年卡 ¥99 /年
- ✓本题每步动画的吴师兄语音讲解(全站陆续覆盖)
- ✓小欧带 8 步通关训练——追问到不看答案也能写对、能 30 秒讲给面试官听
- ✓学习报告,记录每道题的掌握程度
76k+ GitHub Star · 吴师兄开源图解算法,几十万开发者在看的算法讲解
想成体系刷透这类套路?去图解算法专题