给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
这个题我用的递归进行求解的,核心思想就是,用一个区间来进行判断,左孩子一定在(MIN,父节点)内,右孩子一定在(父节点,MAX)内。
核心代码如下:
/**
* 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) {
return helper(root,LONG_MIN,LONG_MAX);
}
bool helper(TreeNode* root, long long lower, long long upper) {
if (root == NULL)
return true;
if(root->val > lower && root->val < upper) {
return helper(root->left,lower,root->val) && helper(root->right,root->val,upper);
}
return false;
}
};
此方法用时
另外还可以通过中序遍历,因为中序遍历刚好是从小到大排序。
/**
* 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:
long long ROOT_MIN = LONG_MIN;
bool flag = true;
bool isValidBST(TreeNode* root) {
if(root == NULL)
return true;
isValidBST(root->left);
if(root->val <= ROOT_MIN) {
flag = false;
return flag;
}
ROOT_MIN = root->val;
isValidBST(root->right);
return flag;
}
};
耗时如下