题目描述
给你一个二叉树的根节点 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;
* struct TreeNode *left;
* struct TreeNode *right;
* };
*/
typedef struct TreeNode* TreeNode;
bool isValidBST (TreeNode root){
if(!root) return true;
//在左孩子不为空时,测试当前节点与左孩子的大小关系,如果不符合二叉查找树就返回false
if(root->left && root->val <= root->left->val ) return false;
//在右孩子不为空时,测试当前节点与右孩子的大小关系,如果不符合二叉查找树就返回false
if(root->right && root->val >= root->right->val) return false;
//当左右子树都满足二叉查找树时才返回true
return isValidBST(root->left) && isValidBST(root->right);
}
但当用以上代码测试时,会抛出执行错误
显示这段测试用例不能通过
该用例的图形表示如下
很明显,我们并不能只判断左孩子,右孩子与当前节点的大小关系
在测试一个节点时我们应该规范,其左右孩子的取值范围
所以需要维护一个最大取值,和最小取值
因为题目给定的函数没有维护只两个变量,所以我们另外在写一个函数,再把该函数最终返回的值返回该原函数即可
typedef struct TreeNode* TreeNode;
bool isValid (TreeNode root,int min,int max) {
if(!root) return true;
if(root->left && root->val <= root->left->val && root->val <= min) return false;
if(root->right && root->val >= root->right->val && root->val >= max) return false;
//测试左子树,因为左子树的所有节点值都比当前节点小所以将最大值设置为当前节点
//测试右子树,因为右子树的所有节点值都比当前节点大所以将最小值设置为当前节点
//当左右子树都满足二叉查找树时才返回true
return isValid(root->left,min,root->val) && isValid(root->right,root->val,max);
}
bool isValidBST (TreeNode root){
//根据题目描述中节点元素值的取值范围设置初始的最大值和最小值
return isValid(root,-2147483648,2147483647);
}
现在我们再测试一次
仍然解答错误
因为节点的值可能为边界值,
if(root->left && root->val <= root->left->val && root->val <= min) return false;
if(root->right && root->val >= root->right->val && root->val >= max) return false;
而我们必须把测试范围时的条件设置为 <= 或 >= 以此来避免重复元素出现
所以需要把测试范围扩大
由于扩大测试范围扩大后将超出int所能表示的值 所以我们用 long 类型来经行参数传递
typedef struct TreeNode* TreeNode;
bool isValid (TreeNode root,long min,long max) {
if(!root) return true;
if(root->left && root->val <= root->left->val || root->val <= min) return false;
if(root->right && root->val >= root->right->val || root->val >= max) return false;
return isValid(root->left,min,root->val) && isValid(root->right,root->val,max);
}
bool isValidBST (TreeNode root){
//扩大测试范围
return isValid(root,-2147483649,2147483648);
}
再次测试
哈哈,这次我们总算通过了
好滴!本次分享到这就结束了
如果对铁汁你有帮助的话,记得点赞👍+收藏⭐️+关注➕
我在这先行拜谢了:)文章来源:https://www.toymoban.com/news/detail-702933.html
附上原题链接:https://leetcode.cn/problems/validate-binary-search-tree/submissions/文章来源地址https://www.toymoban.com/news/detail-702933.html
到了这里,关于LeetCode 98. 验证二叉搜索树的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!