题目(leecode T98):
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
方法:
递归法:利用递归发解决本题之前需要先了解一个基础知识,二叉搜索树的中序遍历数组是单调递增的,因此我们可以求出二叉搜索树的中序遍历,然后再判断这个数组是不是单调递增的即可。因此本体的递归法的写法,实际上就是二叉树的中序遍历的递归法。得到这个中序遍历的数组之后,再判断一下这个数组是不是严格单调递增的就可以了。
题解:
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:
bool isValidBST(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* cur = root;
TreeNode* pre = NULL;
while(cur != NULL || !st.empty()){
if(cur != NULL){
st.push(cur);
cur = cur->left;
}else{
cur = st.top();
st.pop();
if(pre != NULL && cur->val <= pre->val) return false; //判断元素是否递增
pre = cur;
cur = cur->right;
}
}
return true;
}
};