leetcode:98. 验证二叉搜索树
题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:![[中等] 98. 验证二叉搜索树 - 图1](/uploads/projects/liangduo-rjrcs@ggu4wq/01fc5d5b6a226c1d11b4f6fcbe2f5725.jpeg)
输入:root = [2,1,3]输出:true
示例 2:![[中等] 98. 验证二叉搜索树 - 图2](/uploads/projects/liangduo-rjrcs@ggu4wq/87e1da2798d03152ee4c69f3cac3e659.jpeg)
输入: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 < maxValdfsValidBST(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% 的用户
