二叉搜索树的定义:
- 左子树的节点全部 小于 当前节点
- 右子树的节点全部 大于 当前节点
- 所有左子树和右子树本身都是二叉搜索树
方法一:中序遍历
只要保证中序遍历展开后,数值单调递增,即为二叉搜索树。
时间复杂度
O
(
n
)
O(n)
O(n),空间复杂度
O
(
n
)
O(n)
O(n)。【优化:使用一个变量存储前一个数值,不断更新。空间复杂度
O
(
1
)
O(1)
O(1)】
方法二:递归解决
将判断一个树是否为二叉搜索树,拆分为
- 左子树是否为二叉搜索树
- 当前值是否比前一个值大
- 右子树是否为二叉搜索树
代码非常简洁,时间负责度 O ( n ) O(n) O(n), 空间复杂度 O ( n ) O(n) O(n)(递归栈)。
附上代码:
中序遍历法
typedef long long ll;
class Solution {
ll prev = LONG_MIN;
bool flag = true;
void inorder(TreeNode* node) {
if(!node || !flag) return;
inorder(node->left);
if(!flag) return;
if(prev >= node->val) {
flag = false;
return ;
}
prev = node->val;
inorder(node->right);
}
public:
bool isValidBST(TreeNode* root) {
inorder(root);
return flag;
}
};
递归法
typedef long long ll;
class Solution {
ll prev = LONG_MIN;
public:
bool isValidBST(TreeNode* root) {
if(!root) return true;
if(!isValidBST(root->left)) return false;
if(root->val <= prev) return false;
prev = root->val;
return isValidBST(root->right);
}
};