本文参考代码随想录
给你一棵所有节点为非负值的二叉搜索树,请你计算树中任意两节点的差的绝对值的最小值。
递归法1
递归法中序遍历二叉搜索树,得到有序数组,然后遍历一遍数组
class Solution {
private:
vector<int> vec;
void traversal(TreeNode* root) {
if(root == nullptr) 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
在二叉树遍历过程中直接计算,记录当前节点的前一个节点pre
class Solution {
private:
int result = INT_MAX;
TreeNode* pre = nullptr;
void traversal(TreeNode* cur) {
if(cur == nullptr) return;
traversal(cur->left);
if(pre != nullptr) {
result = min(result, cur->val - pre->val);
}
pre = cur;
traversal(cur->right);
}
public:
int getMinimumDifference(TreeNode* root) {
traversal(root);
return result;
}
};
迭代法
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* pre = nullptr;
int result = INT_MAX;
while(cur != nullptr || !st.empty()) {
if(cur != nullptr) {
st.push(cur);
cur = cur->left;
}else{
cur = st.top();
st.pop();
if(pre != nullptr) {
result = min(result, cur->val - pre->val);
}
pre = cur;
cur = cur->right;
}
}
return result;
}
};