LeetCode 530.二叉搜索树的最小绝对差
思路
二叉搜索树的重要特性就是有序性,通过中序遍历得到的数组是一个递增的数组,因此这道题目可以简化为在一个有序数组上求两个数的最小差值。
递归法1
把二叉搜索树转换成有序数组,然后遍历一遍数组,就统计出来最小差值了。
class Solution {
private:
vector<int> vec;
void traversal(TreeNode* root) {
if (root == NULL) return;
traversal(root->left);
vec.push_back(root->val); // 将二叉搜索树转换为有序数组
traversal(root->right);
}
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;
}
};
递归法2
在二叉搜索树中序遍历的过程中直接计算
class Solution {
public:
int res = INT_MAX;
TreeNode *pre;
void traversal(TreeNode *cur) {
if(cur == NULL) return;
traversal(cur->left);
if(pre != NULL) {
res = min(res, cur->val - pre->val);
}
pre = cur;
traversal(cur->right);
}
int getMinimumDifference(TreeNode* root) {
traversal(root);
return res;
}
};
迭代法
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
stack<TreeNode *>st;
int res = INT_MAX;
TreeNode *cur = root;
TreeNode *pre = NULL;
while(cur != NULL || !st.empty()) {
if(cur != NULL) {
st.push(cur);
cur = cur->left;
} else {
cur = st.top();
st.pop();
if(pre != NULL) {
res = min(res, cur->val - pre->val);
}
pre = cur;
cur = cur->right;
}
}
return res;
}
};