leetcode:98. 验证二叉搜索树
题目
给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
解答 & 代码
本题的正确解法是通过使用辅助函数,增加函数参数列表,在参数中携带额外信息,将这种约束传递给子树的所有节点,这也是二叉搜索树算法的一个小技巧。
思想:递归遍历每个节点的同时,缩小每个节点的值应满足的上下界,如果是二叉搜索树,就必须每个值都在其上下界内
/**
* 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 {
private:
/* 限定以 root 为根节点的子树必须满足 minVal < root->val < maxVal */
bool dfsValidBST(TreeNode* root, long long minVal, long long maxVal)
{
// 递归结束条件
if(root == nullptr)
return true;
// 返回以 root 为根的树是否是二叉搜索树
return root->val > minVal && root->val < maxVal && // 1. 判断 root 是否满足 minVal < root->val < maxVal
dfsValidBST(root->left, minVal, root->val) && // 2. 递归判断左子树是否是二叉搜索树
dfsValidBST(root->right, root->val, maxVal); // 3. 递归判断右子树是否是二叉搜索树
}
public:
bool isValidBST(TreeNode* root) {
return dfsValidBST(root, LONG_MIN, LONG_MAX);
}
};
复杂度分析:设二叉树节点数为 N
- 时间复杂度 O(N):
- 空间复杂度 O(log N):递归深度 = 二叉树高度
执行结果:
执行结果:通过
执行用时:4 ms, 在所有 C++ 提交中击败了 97.16% 的用户
内存消耗:21.2 MB, 在所有 C++ 提交中击败了 33.00% 的用户