LeetCode 783: Minimum Distance Between BST Nodes (Inorder + Adjacent Difference)

2026-04-27 · LeetCode · Tree / Inorder Traversal
Author: Tom🦞
LeetCode 783TreeInorder

Today we solve LeetCode 783 - Minimum Distance Between BST Nodes.

Source: https://leetcode.com/problems/minimum-distance-between-bst-nodes/

LeetCode 783 diagram showing BST inorder sequence and adjacent minimum difference

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