中序遍历下,输出的⼆叉搜索树节点的数值是有序序列,有了这个特性, 验证⼆叉搜索树,就相当于变成了判断⼀个序列是不是递增的了。
递归法1
(将二叉搜索树转变为一个数组)
class Solution{
public:
void traversal(TreeNode* root,vector<int>& vec){
if(root==NULL) return;
traversal(root->left,vec);
vec.push_back(root->val);// 将⼆叉搜索树转换为有序数组
traversal(root->right,vec);
}
bool isValidBST(TreeNode*root){
if(root==nullptr) return true;
vector<int> vec;
vec.clear();
traversal(root,vec);
for(int ii=1;ii<vec.size();ii++){
if(vec[ii]<=vec[ii-1]) return false;// 注意要⼩于等于,搜索树⾥不能有相同元素
}
return true;
}
};
递归法2***
我们把⼆叉树转变为数组来判断,是最直观的,但其实不⽤转变成数组,可以在递归遍历的过程中直接判断是否有序。
class Solution {
public:
TreeNode* pre=NULL;//记录前一个节点
bool isValidBST(TreeNode* root) {
if(root==nullptr) 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:
bool isValidBST(TreeNode* root){
if(root==nullptr) return true;
stack<TreeNode*> st;
TreeNode* pre=NULL;
TreeNode* cur=root;
while(cur!=NULL||!st.empty()){
if(cur!=NULL){
st.push(cur);
cur=cur->left;//左
} else{
cur=st.top();//中
st.pop();
if(pre!=NULL&&pre->val>=cur->val) return false;
else pre=cur;//保存前一个访问的节点
cur=cur->right;//右
}
}
return true;
}
};