题目描述
原题链接:530. 二叉搜索树的最小绝对差
解题思路
利用BST的特性,采用中序遍历的方式,可以得到单调递增的元素。
1、递归法(中序遍历)
/**
* 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:
TreeNode* pre = NULL; // 指向前一个结点的指针
int res = 1e5; // 存储结果
int getMinimumDifference(TreeNode* root) {
if(!root) return 0;
getMinimumDifference(root->left); // 左
// 不为第一个结点并且当前结点减去头一个结点的值要比res中的更小,则更新
if(pre && root->val - pre->val < res) res = root->val - pre->val; // 中
pre = root; // pre指向当前结点,再去遍历下一个结点
getMinimumDifference(root->right); // 右
return res;
}
};
2、迭代法
/**
* 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:
int getMinimumDifference(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* cur = root;
int res = 1e5;
TreeNode* pre = NULL;
while(cur || !st.empty()) {
while(cur) {
st.push(cur);
cur = cur->left;
}
cur = st.top(); st.pop();
// 中间结点进行处理
if(pre && cur->val - pre->val < res) res = cur->val - pre->val;
pre = cur;
cur = cur->right; // 下一次遍历向右子树遍历
}
return res;
}
};