LeetCode 98 验证二叉搜索树#
目录#
1. 题目描述#
1.1. Limit#
Time Limit: 1000 ms
Memory Limit: 131072 kB
1.2. Problem Description#
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
1.5. Sample Input 1#
输入:
2
/ \
1 3
1.6. Sample Output 1#
输出: true
1.5. Sample Input 2#
输入:
5
/ \
1 4
/ \
3 6
1.6. Sample Output 2#
输出: false
解释: 输入为: [5,1,4,null,null,3,6]
。
根节点的值为 5
,但是其右子节点值为 4
。
1.8. Source#
2. 解读#
DFS,先判断节点是否为空,然后分别比较左右节点的值。需要注意先将上下界设置为 LONG_MIN
和 LONG_MAX
。
也可以使用中序遍历,二叉搜索树的中序遍历应该是递增的,如果出现非递增则返回 False
。
代码参考自官方题解。
3. 代码#
// DFS
class Solution {
public:
bool isNodeBST(TreeNode* pre, long long lower, long long upper)
{
bool leftFalg = false, rightFalg = false;
// 遍历完成
if (pre == nullptr) {
return true;
}
// 如果不符合条件,返回False
if ( pre->val >= upper || pre->val <= lower) {
return false;
}
// 判断左子树和右子树
leftFalg = isNodeBST(pre->left, lower, pre->val);
rightFalg = isNodeBST(pre->right, pre->val, upper);
if (leftFalg && rightFalg) {
return true;
} else {
return false;
}
}
bool isValidBST(TreeNode* root)
{
if (root == nullptr) {
return true;
} else {
return isNodeBST(root, LONG_MIN, LONG_MAX);
}
}
};
// 中序遍历
class Solution {
public:
long long maxNode = LONG_MIN;
bool isValidBST(TreeNode* root)
{
bool leftFlag = 0, rightFlag = 0;
if (root == nullptr) {
return true;
} else {
// 判断左子树
leftFlag = isValidBST(root->left);
// 判断是否升序
if (root->val > maxNode) {
maxNode = root->val;
} else {
return false;
}
// 判断右子树
rightFlag = isValidBST(root->right);
}
if (leftFlag && rightFlag) {
return true;
} else {
return false;
}
}
};
联系邮箱:curren_wong@163.com
CSDN:https://me.csdn.net/qq_41729780
知乎:https://zhuanlan.zhihu.com/c_1225417532351741952
公众号:复杂网络与机器学习
欢迎关注/转载,有问题欢迎通过邮箱交流。