1 题目描述
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
节点的左子树只包含 小于 当前节点的数。
节点的右子树只包含 大于 当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:root = [2,1,3]
输出:true
示例 2:
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
来源:力扣(LeetCode)
链接:98. 验证二叉搜索树
2 算法设计
根据二叉搜索树的特性可知,中序遍历二叉树得到的是一个单增的序列。因此,可以通过比较中序遍历的序列是否单增即可。
注意:本题目不能简单地递归比较左右子树的节点值是否小于根节点,因为整个二叉搜索树都必须满足左子树的所有节点值小于根节点,右子树所有的节点值大于根节点。
3 代码实现
public class IsValidBST {
/**
* 由于二叉搜索树的中序遍历序列为单调递增的序列,
* 因此只需判断中序遍历得到的二叉搜索树的的序列是否单调递增即可,
* 若递增则为二叉搜索树,否则不是。
* @param root
* @return
*/
TreeNode maxNode;
public boolean isValidBST(TreeNode root) {
//二叉搜索树可以为空,递归出口
if (root == null) return true;
//左
boolean left = isValidBST(root.left);
if (left != true) return false;
//中
if (max != null && root.val <= maxNode.val){
return false;
}
maxNode = root;
//右
boolean right = isValidBST(root.right);
return right;
}