题目
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
1、利用BST性质:中序遍历结果递增
由平衡二叉树的性质可知,若是用中序遍历方法,得到的结果会是递增的。
初次外,如果root的结点为空或者只有1个结点的时候,我们认为它也是一棵二叉搜索树。
以这样的思路写出的递归代码:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void traversal(TreeNode* cur , vector<int>& vec)
{
if(cur == NULL) return;
traversal(cur->left,vec);
vec.push_back(cur->val);
traversal(cur->right,vec);
}
bool isValidBST(TreeNode* root) {
vector<int> result;
traversal(root,result);
for(int i =1;i<result.size();i++)
{
if(result[i-1]>=result[i]) return false;
//cout<<result[i]<<endl;
}
return true;
}
};
2、不使用数组,进行优化
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
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;
}
};
3、回顾迭代法求解
对迭代法中序遍历稍加改动:
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
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;
}
};