大致看了一下题解,主要是两种思路:第一种思路就是利用递归进行遍历
第二种思路是利用中序遍历,中序遍历又有两种思路,一种就是利用递归进行中序遍历,另一种就是利用栈来模拟。都行应该
好烦,好难,头大
有个简单的问题~,什么是递归~,它是否是一种引力,还是一种味道
思路一:简单的来说就是下界设为无穷,上界设为无穷(一开始的时候)然后递归找下界,再找上界,如果递归的节点小于上界且在它的右边,那说明递归到一个不是bst的树了。一个不是bst的树配上一个是bst的树,那么一定不是bst树。得到结果。
中序遍历就是利用我们的发现(依据题目的意思可以发现左中右是依次上升的),发现中序遍历出来的一定是一个上升的序列。那么就只要递归来中序遍历,然后检查是否递增就行了。还有一种思路就是利用栈进行模拟,如果是一个递增的,就没问题了
第一个题解:
class Solution {
public:
bool helper(TreeNode* root, long long lower, long long upper) {
if (root == nullptr) {
return true;
}
if (root -> val <= lower || root -> val >= upper) {
return false;
}
return helper(root -> left, lower, root -> val) && helper(root -> right, root -> val, upper);
}
bool isValidBST(TreeNode* root) {
return helper(root, LONG_MIN, LONG_MAX);
}
};
>
第二个题解:
class Solution{
public:
bool isValidBST(TreeNode* root){
stack<TreeNode> stack;
long long inorder=(long long)INT_MIN-1;
while(!stack.empty()||root!=nullptr){//两层while嵌套循环,外层用来遍历所有的节点(即左节点和右节点)
while(root!=nullptr){//里层用来遍历所有的左节点
stack.push(root);
root=root->left;
}
root=stack.top();
stack.pop();
if(root->val<=inorder){
return false;
}
inorder=root->val;
root=root->right;//用来遍历所有的右节点
}
return true;
}
};
用栈进行模拟的
还有一种就是直接利用中序递归来完成的:
clss Solution{
public:
long pre=-100000;
bool isValidBST(TreeNode* root){
if(!root){
return true;
}
if(!isValidBST(root->left)||pre>=root->val)
return false;
return isValidBST(root->right);
}
};
//leetcode题解里找的。很简短的中序遍历代码,但还真不是很好想滴
/*大致思路是这样的:首先如果是空树,那就直接符合题目要求了,所以返回true。那如果是非空的树,就先遍历左边,一直遍历到跟节点
此时会返回一个true,也就是说!isValidBST为false。然后就开始判断||后面的pre>=root->val是真是假,如果这个是真的,那就返回false。如果
这个是假的话呢,就直接跳过这个if语句。然后开始到右节点。右节点又递归到左节点,继续依此判断,循环往复。直到所有节点判断完毕,此时会给出
最终的结果,是false还是true*/