LeetCode 783: Minimum Distance Between BST Nodes (Inorder + Adjacent Difference)
LeetCode 783TreeInorderToday we solve LeetCode 783 - Minimum Distance Between BST Nodes.
Source: https://leetcode.com/problems/minimum-distance-between-bst-nodes/
English
Problem Summary
Given the root of a Binary Search Tree, return the minimum difference between values of any two different nodes.
Key Insight
Inorder traversal of a BST produces a sorted sequence. The minimum absolute difference in a sorted array always appears between adjacent elements, so we only compare current value with the previous inorder value.
Algorithm
- Run inorder DFS.
- Keep prev as the previous visited value.
- Update answer with node.val - prev whenever prev exists.
- Continue until traversal ends.
Complexity Analysis
Time: O(n).
Space: O(h) recursion stack, where h is tree height.
Reference Implementations (Java / Go / C++ / Python / JavaScript)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private Integer prev = null;
private int ans = Integer.MAX_VALUE;
public int minDiffInBST(TreeNode root) {
inorder(root);
return ans;
}
private void inorder(TreeNode node) {
if (node == null) return;
inorder(node.left);
if (prev != null) {
ans = Math.min(ans, node.val - prev);
}
prev = node.val;
inorder(node.right);
}
}/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func minDiffInBST(root *TreeNode) int {
ans := int(^uint(0) >> 1)
prev := -1
hasPrev := false
var inorder func(*TreeNode)
inorder = func(node *TreeNode) {
if node == nil {
return
}
inorder(node.Left)
if hasPrev {
if node.Val-prev < ans {
ans = node.Val - prev
}
}
prev = node.Val
hasPrev = true
inorder(node.Right)
}
inorder(root)
return ans
}/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int ans = INT_MAX;
TreeNode* prev = nullptr;
int minDiffInBST(TreeNode* root) {
inorder(root);
return ans;
}
void inorder(TreeNode* node) {
if (!node) return;
inorder(node->left);
if (prev) ans = min(ans, node->val - prev->val);
prev = node;
inorder(node->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
class Solution:
def minDiffInBST(self, root: Optional[TreeNode]) -> int:
self.prev = None
self.ans = float('inf')
def inorder(node: Optional[TreeNode]) -> None:
if not node:
return
inorder(node.left)
if self.prev is not None:
self.ans = min(self.ans, node.val - self.prev)
self.prev = node.val
inorder(node.right)
inorder(root)
return self.ans/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
var minDiffInBST = function(root) {
let prev = null;
let ans = Number.MAX_SAFE_INTEGER;
const inorder = (node) => {
if (!node) return;
inorder(node.left);
if (prev !== null) {
ans = Math.min(ans, node.val - prev);
}
prev = node.val;
inorder(node.right);
};
inorder(root);
return ans;
};中文
题目概述
给定一棵二叉搜索树(BST)的根节点,返回任意两个不同节点值之间的最小差值。
核心思路
BST 的中序遍历结果是升序序列。升序序列中的最小绝对差一定出现在相邻元素之间,所以遍历时只需要比较当前节点值与前一个中序值即可。
算法步骤
- 对 BST 做中序遍历。
- 用 prev 记录上一个访问到的值。
- 每到一个新节点,尝试用 node.val - prev 更新最小答案。
- 继续遍历直到结束。
复杂度分析
时间复杂度:O(n)。
空间复杂度:O(h),其中 h 为树高(递归栈)。
多语言参考实现(Java / Go / C++ / Python / JavaScript)
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private Integer prev = null;
private int ans = Integer.MAX_VALUE;
public int minDiffInBST(TreeNode root) {
inorder(root);
return ans;
}
private void inorder(TreeNode node) {
if (node == null) return;
inorder(node.left);
if (prev != null) {
ans = Math.min(ans, node.val - prev);
}
prev = node.val;
inorder(node.right);
}
}/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func minDiffInBST(root *TreeNode) int {
ans := int(^uint(0) >> 1)
prev := -1
hasPrev := false
var inorder func(*TreeNode)
inorder = func(node *TreeNode) {
if node == nil {
return
}
inorder(node.Left)
if hasPrev {
if node.Val-prev < ans {
ans = node.Val - prev
}
}
prev = node.Val
hasPrev = true
inorder(node.Right)
}
inorder(root)
return ans
}/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
int ans = INT_MAX;
TreeNode* prev = nullptr;
int minDiffInBST(TreeNode* root) {
inorder(root);
return ans;
}
void inorder(TreeNode* node) {
if (!node) return;
inorder(node->left);
if (prev) ans = min(ans, node->val - prev->val);
prev = node;
inorder(node->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
class Solution:
def minDiffInBST(self, root: Optional[TreeNode]) -> int:
self.prev = None
self.ans = float('inf')
def inorder(node: Optional[TreeNode]) -> None:
if not node:
return
inorder(node.left)
if self.prev is not None:
self.ans = min(self.ans, node.val - self.prev)
self.prev = node.val
inorder(node.right)
inorder(root)
return self.ans/**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
var minDiffInBST = function(root) {
let prev = null;
let ans = Number.MAX_SAFE_INTEGER;
const inorder = (node) => {
if (!node) return;
inorder(node.left);
if (prev !== null) {
ans = Math.min(ans, node.val - prev);
}
prev = node.val;
inorder(node.right);
};
inorder(root);
return ans;
};
Comments