530. 二叉搜索树的最小绝对差
给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。 差值是一个正数,其数值等于两值之差的绝对值。
示例 1:
输入:root = [4,2,6,1,3] 输出:1 示例 2:
输入:root = [1,0,48,null,null,12,49] 输出:1
思路
把整个树遍历一遍,再转化为数组 因为二叉搜索树的特性,选用中序遍中序遍历(Inorder Traversal)对于二叉搜索树(BST,Binary Search Tree)具有一个特殊的性质:遍历得到的节点值序列是有序的。这一性质对于解决当前问题非常有用。
考虑二叉搜索树的定义:
- 任意节点的左子树中的所有元素的值都小于该节点的值。
- 任意节点的右子树中的所有元素的值都大于该节点的值。
当我们对这样的树进行中序遍历时,我们首先遍历左子树(其中所有的值都较小),然后访问根节点,最后遍历右子树(其中所有的值都较大)。这确保了我们按照从小到大的顺序访问所有节点。
一旦我们有了一个有序的节点值列表,计算任意两个相邻元素之间的差值就变得非常简单。这也使得找到最小的这种差值变得容易。
题解
/**
* 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 inorderTraversal(TreeNode* root, vector<int>& values) {
if (root == nullptr) {
return;
}
inorderTraversal(root->left, values);
values.push_back(root->val);
inorderTraversal(root->right, values);
}
int getMinimumDifference(TreeNode* root) {
vector<int> values;
inorderTraversal(root, values);
int minDifference = INT_MAX;
for (int i = 1; i < values.size(); ++i) {
minDifference = min(minDifference, abs(values[i] - values[i-1]));
}
return minDifference;
}
};