98.验证二叉搜索树
class Solution {
private:
vector<int> vec;
void traversal(TreeNode* root){
if(!root) return;
traversal(root->left);
vec.push_back(root->val);
traversal(root->right);
}
public:
bool isValidBST(TreeNode* root) {
if(!root) return true;
traversal(root);
for(int i=0;i<vec.size();i++){
if(i>0&&vec[i]<=vec[i-1]) return false;
}
return true;
}
};
二叉搜索数用中序遍历输出的节点是有序递增数列,所以先用中序遍历节点,用数组记录,再怕判断数组是否为递增数列,即可判断是否为二擦搜索数
class Solution {
public:
TreeNode* pre=NULL;
bool isValidBST(TreeNode* root) {
if(!root) return true;
int left=isValidBST(root->left);
if(pre&&pre->val>=root->val) return false;
pre=root;
int right=isValidBST(root->right);
return left&&right;
}
};
这是运用了双指针法,利用中序遍历,判断前一个节点值和现在节点的大小关系
530.二叉搜索树的最小绝对差
class Solution {
private:
TreeNode* pre=NULL;
int gap=INT_MAX;
void traversal(TreeNode* root){
if(!root) return;
traversal(root->left);
if(pre){
if(root->val-pre->val<gap){
gap=root->val-pre->val;
}
}
pre=root;
traversal(root->right);
}
public:
int getMinimumDifference(TreeNode* root) {
traversal(root);
return gap;
}
};
因为搜索二叉树中序遍历是单调递增的,所以两个不同节点的最小差值必定是相邻节点的差值
class Solution {
public:
TreeNode* pre=NULL;
int gap=INT_MAX;
int getMinimumDifference(TreeNode* root) {
if(!root) return gap;
gap=getMinimumDifference(root->left);
if(pre){
if(root->val-pre->val<gap){
gap=root->val-pre->val;
}
}
pre=root;
gap=getMinimumDifference(root->right);
return gap;
}
};
精简版