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;
}
};
以上代码是把二叉搜索树转换成有序数组了。
其实在中序遍历的过程中,我们就可以直接计算。
不过,需用一个pre节点记录一下cur节点的前一个节点。
如下图:
代码如下:
class Solution {
private:
int result = INT_MAX;
TreeNode* pre;
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;
}
};
是不是看上去挺简单的。
2、迭代
采用中序遍历迭代法,代码如下:
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* pre = NULL;
int result = INT_MAX;
while (cur != NULL || !st.empty()) {
if (cur != NULL) {
// 指针来访问节点,访问到最底层
st.push(cur); // 将访问的节点放进栈
cur = cur->left; // 左
} else {
cur = st.top();
st.pop();
if (pre != NULL) { // 中
result = min(result, cur->val - pre->val);
}
pre = cur;
cur = cur->right; // 右
}
}
return result;
}
};