- 递归1----不用数组
- 递归2------借助数组
- 迭代
class Solution {
public:
TreeNode* pre = NULL;
int result = INT_MAX;
void traversal(TreeNode* root ) {
if (root == NULL) return;
traversal(root->left );
if (pre != NULL)
result = min (result, (root->val - pre->val));
pre = root;
traversal(root->right );
}
int getMinimumDifference(TreeNode* root) {
traversal(root );
return result;
}
};
- 以上是 卡哥Ac
- 我能想到这个思路 就是在上一个题目 0098验证二叉搜索树的 迭代版本--找树最左边结点为最小值 的基础上 只需要添加一个判断即可
- 也就是说 可以再设置一个全局变量 result = INT_MAX 然后额外一个递归函数 在pre = root之前就进行比较较小值并赋值
- 但是我写的代码 还是有差距的 我没有想到把result设置成全局变量 而是打算让result作为递归函数的输入参数 wa代码见下
class Solution {
public:
TreeNode* pre = NULL;
void traversal(TreeNode* root, int result) {
if (root == NULL) return;
traversal(root->left, result);
if (pre != NULL)
result = min (result, (root->val - pre->val));
pre = root;
traversal(root->right, result);
}
int getMinimumDifference(TreeNode* root) {
int result = INT_MAX;
traversal(root, result);
return result;
}
};
-
无论什么测试用例 结果都是2147483647 应该是INT_MAX的值 也就是说 虽然进入traversal(root, result)函数 但是并没有对result的值进行修改 我猜测可能是因为值传递而地址传递的原因 目前还不会改正错误 下次再看
-
递归2----借助数组
class Solution {
public:
vector<int> vec;
void traversal(TreeNode* root) {
if (root == NULL) return;
traversal(root->left);
vec.push_back(root->val);
traversal(root->right);
}
int getMinimumDifference(TreeNode* root) {
int result = INT_MAX;
traversal(root);
if (vec.size() <= 1) return 0;
for (int i = 1; i < vec.size(); i++) {
result = min(result, vec[i] - vec[i - 1]);
}
return result;
}
};
- !!!二叉搜索树 经过中序遍历 即得有序数组 将问题 求二叉搜索树的最值 转换为 求有序数组的最值 这个方法最直观最简单
- 迭代法-----在0098验证二叉搜索树的 迭代版本基础上 加两行代码
class Solution {
public:
int getMinimumDifference(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* pre = NULL;
TreeNode* cur = root;
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;
}
};
- 迭代版本 虽然不是最直观的 但理解了模板的话是最好改的