问题:给你一个二叉树的根节点 root
,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
/**
* 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) {}
* };
*/
算法:结点的左子树必定全部小于该结点值 val ,结点的右子树必定全部大雨该结点值 val ,所以创立新函数导入 max 、min 值,再令其满足其他条件即可。
注意,不能单独判断该结点的左孩子结点是否小于他,右孩子结点是否大于他,必须要求整个子树都符合条件才可。
代码:
class Solution {
public:
bool BST(struct TreeNode* node,long min,long max){
if(!node) return true;// 空结点返回true
if(node->val <= min || node->val >= max) return false;// 结点值val如果小于最小的或者大于最大的,返回false
return BST(node->left,min,node->val) && BST(node->right,node->val,max);
}
bool isValidBST(TreeNode* root) {
return BST(root,LONG_MIN,LONG_MAX);// LONG_MIN是long的最小数值,LONG_MAX是long的最大数值
}
};