【
给你一个二叉树的根节点 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/validate-binary-search-tree
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
】
递归的时候这两句是重点,当时调了很久
retl = OrderRoot(root->left, min, root->val);
retr = OrderRoot(root->right, root->val, max);
即左子树遍历时,更新了最大值(因为可能是右分支的左子树),右子树遍历时更新了最小值(因为可能是左分支的右子树)。
bool OrderRoot(struct TreeNode* root, long min, long max) {
bool retl, retr;
if (root == NULL) {
return true;
}
if ((root->val >= max) || (root->val <= min)) {
return false;
}
retl = OrderRoot(root->left, min, root->val);
retr = OrderRoot(root->right, root->val, max);
if (retl == false || retr == false) {
return false;
} else {
return true;
}
}
bool isValidBST(struct TreeNode* root){
bool ret;
ret = OrderRoot(root, LONG_MIN, LONG_MAX);
return ret;
}
/*
做题错误点记录
1) min max 传入时需小心
递归 OrderRoot(root->left, min, root->val)
写成 OrderRoot(root->left, MIN, root->val) 出错
2)
INT_MAX/INT_MIN 出错,得改成 LONG_MAX/LONG_MIN
3)改成 LONG_MAX/LONG_MIN后,子函数要用long 而不是 int
*/