验证二叉搜索树
题目链接:转载力扣
难度:中等
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例
输入:root = [2,1,3]
输出:true
思路
要知道中序遍历下,输出的二叉搜索树节点的数值是有序序列。
有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了。
错误:不能单纯的比较左节点小于中间节点,右节点大于中间节点就完事了。
样例中最小节点 可能是int的最小值,如果这样使用最小的int来比较也是不行的。
此时可以初始化比较元素为longlong的最小值。
因为 BST 左小右大的特性是指 root.val 要比左子树的所有节点都更大,要比右子树的所有节点都小,你只检查左右两个子节点当然是不够的。
正确解法是通过使用辅助函数,增加函数参数列表,在参数中携带额外信息,将这种约束传递给子树的所有节点,这也是二叉搜索树算法的一个小技巧吧。
二叉树的结点定义
//二叉树节点的定义。
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(){}
TreeNode(int val){
this.val = val;
}
TreeNode(int val,TreeNode left,TreeNode right){
this.val = val;
this.left = left;
this.right = right;
}
}
递归代码
class Solution {
public boolean isValidBST(TreeNode root) {
return isValidBST(root,null,null);
}
/* 限定以 root 为根的子树节点必须满足 max.val > root.val > min.val */
private boolean isValidBST(TreeNode root,TreeNode min,TreeNode max){
if(root == null) return true;
// 若 root.val 不符合 max 和 min 的限制,说明不是合法 BST
if(min != null && min.val >= root.val) return false;
if(max != null && max.val <= root.val) return false;
// 限定左子树的最大值是 root.val,右子树的最小值是 root.val
return isValidBST(root.left,min,root) && isValidBST(root.right,root,max);
}
}