# 验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

 

示例 1:

输入:root = [2,1,3]

输出:
true

示例 2:

输入:root = [5,1,4,null,null,3,6]

输出:
false
解释:
根节点的值是 5 ,但是右子节点的值是 4 。

 

提示:

以下错误的选项是?

## aop ### before ```cpp #include using namespace std; 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) {} }; ``` ### after ```cpp ``` ## 答案 ```cpp class Solution { public: bool judge(TreeNode *root, long start, long end) { if (!root) return true; if (start >= root->val || end <= root->val) return false; return judge(root->left, start, root->val); } bool isValidBST(TreeNode *root) { long start = INT_MIN - 1; long end = INT_MAX + 1; return judge(root, start, end); } }; ``` ## 选项 ### A ```cpp class Solution { public: TreeNode *pre; bool isValidBST(TreeNode *root) { if (!root) return true; if (!isValidBST(root->left)) return false; if (pre && pre->val >= root->val) return false; pre = root; if (!isValidBST(root->right)) return false; return true; } }; ``` ### B ```cpp class Solution { public: void midorder(TreeNode *root, vector &arr) { if (root) { midorder(root->left, arr); arr.push_back(root->val); midorder(root->right, arr); } } bool isValidBST(TreeNode *root) { vector arr; midorder(root, arr); for (int i = 1; i < arr.size(); i++) { if (arr[i] <= arr[i - 1]) return false; } return true; } }; ``` ### C ```cpp class Solution { public: bool isValidBST(TreeNode *root) { if (root) { long long f = -0x3f3f3f3f3f3f; return dfs(root, f); } else return true; } bool dfs(TreeNode *root, long long &f_val) { bool res = true; if (root) { res &= dfs(root->left, f_val) && (root->val > f_val); if (!res) return false; f_val = root->val; res &= dfs(root->right, f_val); } return res; } }; ```