给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3] 输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示:
- 树中节点数目范围在
[1, 104]
内 -231 <= Node.val <= 231 - 1
-
//结题思路1:递归的查看左子树和柚子树是否分别符合二叉搜索树 /** * 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: long max=LONG_MIN; bool isValidBST(TreeNode* root) { //中序遍历 if(root==NULL){ return true; } //看看左子树手否成立 bool l,r; l=isValidBST(root->left); if(max<root->val){ max=root->val; } else{ return false; } //看看左子树手否成立 r=isValidBST(root->right); return l&&r; } };
//利用二叉搜索树和中序遍历可以得到递增序列的特性,先中序表里,在看最后的序列是否递增 /** * 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: vector<int> temp; void midorder(TreeNode* root){ if(root==NULL) return ; //左 midorder(root->left); //中 temp.push_back(root->val); //右 midorder(root->right); } public: bool isValidBST(TreeNode* root) { midorder(root); for(int i=1;i<temp.size();i++){ //是否符合递增序列 if(temp[i]<=temp[i-1]){ return false; } } return true; } };