题目来源
530:https://leetcode.cn/problems/minimum-absolute-difference-in-bst/description/
783: https://leetcode.cn/problems/minimum-distance-between-bst-nodes/
C++题解1:递归法,中序遍历。通过中序遍历将二叉搜索树转化成递增数组,再寻找最小值就简单得多。
class Solution {
public:
void zhongxu(TreeNode* node, vector<int>& nums) {
if(!node) return;
zhongxu(node->left, nums);
nums.push_back(node->val);
zhongxu(node->right, nums);
return;
}
int getMinimumDifference(TreeNode* root) {
vector<int> nums;
zhongxu(root, nums);
int len = nums.size();
int res = nums[1] - nums[0];
for(int i = 2; i < len; i++) {
if(res > nums[i] - nums[i-1]) res = nums[i] - nums[i-1];
}
return res;
}
};
C++题解2:在中序遍历中直接计算,用pre记录上一节点,就不用转换成数组。
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;
}
};
C++题解3:迭代法,中序遍历。
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;
}
};