题解:
递归:中序遍历将二叉搜索树转为有序数组
/**
* 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:
vector<int> result;
void traversal(TreeNode* node){
if(node == NULL){
return;
}
//左
traversal(node->left);
//中
result.push_back(node->val);
//右
traversal(node->right);
return;
}
int getMinimumDifference(TreeNode* root) {
//转为有序数组 递增序列
traversal(root);
int mindiffer = INT_MAX;
for(int i = 0;i<result.size()-1;i++){
if(result[i+1]-result[i]<mindiffer){
mindiffer = result[i+1]-result[i];
}
}
return mindiffer;
}
};
递归:在递归中序遍历的同时计算最小差值绝对值
中序遍历是一个有序序列,遍历的同时用一个指针指向前一个结点,计算前一个结点和当前结点的差值绝对值与最小值比较即可
class Solution {
public:
int result = INT_MAX;
TreeNode* pre = NULL;
void traversal(TreeNode* node){
if(node == NULL){
return;
}
//左
traversal(node->left);
//中
if(pre!=NULL){
int differ = node->val-pre->val;
if(differ<result){
result = differ;
}
}
//记录前一个
pre = node;
//右
traversal(node->right);
return;
}
int getMinimumDifference(TreeNode* root) {
traversal(root);
return result;
}
};
迭代:
用栈模拟中序遍历:
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
int result = INT_MAX;
stack<TreeNode*> st;
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){
result = min(result,cur->val-pre->val);
}
//记录前一个结点
pre = cur;
//右
cur = cur->right;
}
}
return result;
}
};