98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
通过次数219,774提交次数656,653
分析
解法一(递归)
首先,二叉搜索树的性质我们需要知道,左子树的值小于根节点的值,右子树的值大于根节点的值,左右子树也都是二叉搜索树。
那么我们设计这样一个递归函数:dfs(root , lower , upper)
,代表根节点为root,根节点的值需要在(lower , upper)
的范围内,如果左子树不为空的话,那么就把 upper 更改为 root->val , 如果右子树不为空的话,那么就把 lower 更改为 root->val。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool dfs(TreeNode* root , long long lower , long long upper) {
if(root == nullptr) return true;
if(root->val <= lower || root->val >= upper) return false; // 判断是否在(lower , upper)范围内
return dfs(root->left , lower , root->val) && dfs(root->right , root->val , upper); // 判断左右子树
}
bool isValidBST(TreeNode* root) {
return dfs(root , LONG_MIN , LONG_MAX);
}
};
解法二(中序遍历)
我们需要知道:
二叉搜索树的中序遍历是一个递增的数列
那么就很好办了,我们对树进行中序遍历,最后判断是否是严格单调递增的数列即可。
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
vector<int> cur;
// 中序遍历
void dfs(TreeNode* root) {
if(root == nullptr) return;
dfs(root->left);
cur.push_back(root->val);
dfs(root->right);
}
bool isValidBST(TreeNode* root) {
dfs(root);
for(int i = 0; i < cur.size() - 1; i ++)
if(cur[i] >= cur[i+1])
return false;
return true;
}
};