# [783. 二叉搜索树节点最小距离](https://leetcode.cn/problems/minimum-distance-between-bst-nodes) [English Version](/solution/0700-0799/0783.Minimum%20Distance%20Between%20BST%20Nodes/README_EN.md) ## 题目描述 <!-- 这里写题目描述 --> <p>给你一个二叉搜索树的根节点 <code>root</code> ,返回 <strong>树中任意两不同节点值之间的最小差值</strong> 。</p> <p>差值是一个正数,其数值等于两值之差的绝对值。</p> <p> </p> <div class="original__bRMd"> <div> <p><strong>示例 1:</strong></p> <img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/0700-0799/0783.Minimum%20Distance%20Between%20BST%20Nodes/images/bst1.jpg" style="width: 292px; height: 301px;" /> <pre> <strong>输入:</strong>root = [4,2,6,1,3] <strong>输出:</strong>1 </pre> <p><strong>示例 2:</strong></p> <img alt="" src="https://fastly.jsdelivr.net/gh/doocs/leetcode@main/solution/0700-0799/0783.Minimum%20Distance%20Between%20BST%20Nodes/images/bst2.jpg" style="width: 282px; height: 301px;" /> <pre> <strong>输入:</strong>root = [1,0,48,null,null,12,49] <strong>输出:</strong>1 </pre> <p> </p> <p><strong>提示:</strong></p> <ul> <li>树中节点的数目范围是 <code>[2, 100]</code></li> <li><code>0 <= Node.val <= 10<sup>5</sup></code></li> </ul> <p> </p> <p><strong>注意:</strong>本题与 530:<a href="https://leetcode.cn/problems/minimum-absolute-difference-in-bst/">https://leetcode.cn/problems/minimum-absolute-difference-in-bst/</a> 相同</p> </div> </div> ## 解法 <!-- 这里可写通用的实现逻辑 --> **方法一:中序遍历** 中序遍历二叉搜索树,获取当前节点与上个节点差值的最小值即可。 <!-- tabs:start --> ### **Python3** <!-- 这里可写当前语言的特殊实现逻辑 --> ```python # 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: def dfs(root): if root is None: return dfs(root.left) nonlocal ans, prev ans = min(ans, abs(prev - root.val)) prev = root.val dfs(root.right) ans = prev = inf dfs(root) return ans ``` ### **Java** <!-- 这里可写当前语言的特殊实现逻辑 --> ```java /** * 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 int ans; private int prev; private int inf = Integer.MAX_VALUE; public int minDiffInBST(TreeNode root) { ans = inf; prev = inf; dfs(root); return ans; } private void dfs(TreeNode root) { if (root == null) { return; } dfs(root.left); ans = Math.min(ans, Math.abs(root.val - prev)); prev = root.val; dfs(root.right); } } ``` ### **C++** ```cpp /** * 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: const int inf = INT_MAX; int ans; int prev; int minDiffInBST(TreeNode* root) { ans = inf, prev = inf; dfs(root); return ans; } void dfs(TreeNode* root) { if (!root) return; dfs(root->left); ans = min(ans, abs(prev - root->val)); prev = root->val; dfs(root->right); } }; ``` ### **Go** ```go /** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */ func minDiffInBST(root *TreeNode) int { inf := 0x3f3f3f3f ans, prev := inf, inf var dfs func(*TreeNode) dfs = func(root *TreeNode) { if root == nil { return } dfs(root.Left) ans = min(ans, abs(prev-root.Val)) prev = root.Val dfs(root.Right) } dfs(root) return ans } func min(a, b int) int { if a < b { return a } return b } func abs(x int) int { if x < 0 { return -x } return x } ``` <!-- tabs:end -->