算法笔记
本题为验证二叉搜索树,本题乍一看比较简单,但很容易陷入某种误区,注意避坑。
题目描述
解题思路
常规思路
我们知道二叉搜索树其实就是一个有序数组,判断是否是二叉搜索树就相当于判断是否是有序数组,就可以考虑定义一个数组vec,通过中序遍历(看见二叉搜索树优先中序)将元素装入数组中,然后另加一个for循环即可就可以解决本题。
递归思路
递归思路也并不难理解,我们需要定义一个最小值去与节点的值进行比较,如果每个节点符合条件即可,不符合就返回false。这里有一个陷阱就是力扣当中后台数据有int最小值测试用例,所以都把应该改成了longlong最小值即可。
误区
不能单纯的比较左节点小于中间节点,右节点大于中间节点。判断是否为二叉搜索树要比较左子树所有节点小于中间节点,右子树所有节点大于中间节点才可以。
代码部分
常规思路
class Solution {
private:
vector<int> vec;
void traversal(TreeNode* root) {
if (root == NULL) return;
traversal(root->left);
vec.push_back(root->val);
traversal(root->right);
}
public:
bool isValidBST(TreeNode* root) {
vec.clear();
traversal(root);
for (int i = 1; i < vec.size(); i++) {
if (vec[i] <= vec[i - 1]) return false;
}
return true;
}
};
递归方法
class Solution {
public:
long long maxValue = LONG_MIN;
bool isValidBST(TreeNode* root) {
if(root == nullptr) {
return true;
}
bool left = isValidBST(root->left);
if(root->val > maxValue) {
maxValue = root->val;
}else {
return false;
}
bool right = isValidBST(root->right);
return left && right;
}
};
结语
本题容易掉入陷阱,跳出陷阱本题就可以迎刃而解。