一开始:我认为递归判断使得左子树<节点<右子树的值即可。
然而可能存在根节点的右子树的左子树的值比根节点小的情况。
又想了一会,无果,只能中序遍历存储在vector中然后判断是否为升序排列
class Solution {
public:
void func(TreeNode*root,vector<int>&values){
if(root){
func(root->left,values);
values.push_back(root->val);
func(root->right,values);
}
}
bool isValidBST(TreeNode* root) {
vector<int>values;
func(root,values);
for(int i=0;i<values.size()-1;++i){
if(values[i+1]<=values[i])
return false;
}
return true;
}
};
方法一:还是中序遍历,不过将用于判断的变量在main函数中维护,使每次中序遍历的值小于上次中序遍历的值以实现严格升序排列
class Solution {
public:
bool isValidBST(TreeNode* root) {
stack<TreeNode*>stack;
long long v=static_cast<long long>INT_MIN-1;//这里又长见识了
while(!stack.empty()||root!=nullptr){
while(root){
stack.push(root);
root=root->left;
}
root=stack.top();
stack.pop();
if(root->val<=v)
return false;
v=root->val;
root=root->right;
}
return true;
}
};
方法二:递归
递归判断左右子树是否符合条件,我开始只是判断左子树<节点<右子树,而正确的应该是判断节点的值是否在一个范围内
class Solution {
public:
bool func(TreeNode*root,long long low,long long high){
if(root){
if(root->val<high&&low<root->val){
return func(root->left,low,static_cast<long long>(root->val))
&&func(root->right,static_cast<long long>(root->val),high);
}
return false;
}
return true;
}
bool isValidBST(TreeNode* root) {
long long minv=static_cast<long long>(INT_MIN)-1;
long long maxv=static_cast<long long>(INT_MAX)+1;
cout<<minv;
return func(root,minv,maxv);
}
};