题干:
代码:中序遍历成有序数组逐一比较相邻两个数之间的差值,注意这里是取最小值所以定义的初始值应该是非常大的INT_MAX!!!
class Solution {
public:
void traversal(TreeNode* root, vector<int>&a){
if(root == NULL)return;
traversal(root->left,a);
a.push_back(root->val);
traversal(root->right,a);
}
int getMinimumDifference(TreeNode* root) {
if(root == NULL)return 0;
vector<int>res;
traversal(root,res);
int minabs = INT_MAX;
for(int i = 1; i < res.size(); i++){
if(res[i] - res[i-1] < minabs) minabs = res[i] - res[i-1];
}
return minabs;
}
};
不借助额外空间用双指针:
class Solution {
public:
TreeNode* pre = NULL;
int res = INT_MAX;
void traversal(TreeNode* cur){
if(cur == NULL)return;
traversal(cur->left);
if(pre != NULL && res > abs(pre->val - cur->val))res = abs(pre->val - cur->val);
pre = cur;
traversal(cur->right);
}
int getMinimumDifference(TreeNode* root) {
if(root == NULL)return 0;
traversal(root);
return res;
}
};
值得注意的是,只要将一些变量定义在函数外面的话就不需要再重新定义了。
而且,双指针的移动思路就在中序遍历的“中”处,分为赋值与移动,先判断目前差值是否小于定义值,且pre不为空,然后在if外将cur的值赋给pre(不管判断符不符合都必须要移动)。