题目链接:
大概思路:
题目要求:
给你一课二叉搜索树,要求返回任意两个节点的最小差值(节点值都是正的)
数组法:
思路:
由于二叉搜索树的特性,用中序遍历的话,其节点值可构成升序数组,所以用中序遍历构造数组,然后数组里的值两两对比(由于是升序,所以两两对比差值最小),最后得出最小绝对差。
代码:
分两步,中序遍历构造升序数组和数组内两两比较得出最小差值。
class Solution {
private:
//1.中序遍历构造升序数组
vector<int> vec;
void traversal(TreeNode* root) {
if (root == NULL) return;
traversal(root->left);
vec.push_back(root->val); // 将二叉搜索树转换为有序数组
traversal(root->right);
}
//2.数组内两两比较得出最小差值
public:
int getMinimumDifference(TreeNode* root) {
vec.clear();
traversal(root);
if (vec.size() < 2) return 0;
int result = INT_MAX;
for (int i = 1; i < vec.size(); i++) { // 统计有序数组的最小差值
result = min(result, vec[i] - vec[i-1]);
}
return result;
}
};
双指针法:
思路:
继承数组法,差别在于不用构造一个新的数组,可以直接在中序遍历的过程中比对。
class Solution {
private:
int result = INT_MAX;
TreeNode* pre = NULL;
void traversal(TreeNode* cur) {
if (cur == NULL) return;
traversal(cur->left); // 左
if (pre != NULL){ // 中
result = min(result, cur->val - pre->val);
}
pre = cur; // 记录前一个
traversal(cur->right); // 右
}
public:
int getMinimumDifference(TreeNode* root) {
traversal(root);
return result;
}
};