给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
注意:左子树的全部节点的值都要比中间节点小,右子树的全部节点的值都要比中间节点的大。
思路:中序遍历,左中右;这样遍历的话,节点里的值是严格递增的。可以用两个节点,定义一个pre节点进行比较。或者有一个更便于理解的就是进行中序遍历将元素放在一个数组里,判断这个数组是否为递增的。
class Solution {
public:
TreeNode* pre=NULL;//定义现在遍历的前一个节点
bool isValidBST(TreeNode* root) {
//中序遍历 左中右
//一定是有序严格递增的
if(root==NULL) return true;
bool left=isValidBST(root->left);
if(pre!=NULL&&pre->val>=root->val) return false;
pre=root;
bool right=isValidBST(root->right);
return left&&right;
}
};
class Solution {
public:
vector<int> res;
void traversal(TreeNode* node){
//中序遍历 左中右
if(node==NULL) return;
traversal(node->left);
res.push_back(node->val);
traversal(node->right);
}
bool isValidBST(TreeNode* root) {
res.clear();//清空res中的所有元素
traversal(root);
for(int i=1;i<res.size();++i)
{
if(res[i]<=res[i-1]) return false;
}
return true;
}
};