给你一个二叉搜索树的根节点 root
,返回 树中任意两不同节点值之间的最小差值 。
差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入:root = [4,2,6,1,3] 输出:1
示例 2:
输入:root = [1,0,48,null,null,12,49] 输出:1
提示:
- 树中节点的数目范围是
[2, 104]
0 <= Node.val <= 10^5
/**
* 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:
void dfs(TreeNode* root, int& pre, int& ans) {
if (root == nullptr)
return;
dfs(root->left, pre, ans);
if (pre == -1)
pre = root->val;
else {
ans = min(ans, root->val - pre);
pre = root->val;
}
dfs(root->right, pre, ans);
}
int getMinimumDifference(TreeNode* root) {
int ans = INT_MAX, pre = -1;
dfs(root, pre, ans);
return ans;
}
};
首先定义了一个dfs函数,用来遍历二叉搜索树。该函数的参数包括当前节点root,前一个节点的值pre和最小差值ans。
在dfs函数中,首先判断如果当前节点为空,直接返回。然后递归调用dfs函数遍历当前节点的左子树。接着判断如果pre的值为-1,表示当前节点是二叉搜索树中最小的节点,将pre的值设为当前节点的值。否则,计算当前节点值与pre的差值,并更新ans为差值的最小值,然后将pre的值设为当前节点的值。最后递归调用dfs函数遍历当前节点的右子树。
在getMinimumDifference函数中,初始化ans为INT_MAX,pre为-1。然后调用dfs函数遍历整个二叉搜索树。最后返回ans作为结果,即任意两个节点值之间的最小差值。
实际上,这段代码利用了二叉搜索树的性质,即中序遍历二叉搜索树会得到一个递增的序列。所以在中序遍历过程中,只需要比较当前节点和前一个节点的差值,并更新最小差值即可。