98. 验证二叉搜索树
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
节点的左子树只包含小于当前节点的数。
节点的右子树只包含大于当前节点的数。
所有左子树和右子树自身必须也是二叉搜索树。
递归方式:
是否是搜索二叉树
一、 列可能性:
条件1:左子树是搜索树
条件2:右子树整体是搜索二叉树
条件3:左子树的最大值小于x.value,右子树的最小值大于x.value
二、向左右子树要信息(并集)
是否是搜索二叉树,最大值和最小值
递归对所有节点是一视同仁,所以递归的方法也要返回这个信息
class Solution { public boolean isValidBST(TreeNode root) { Info info=process(root); return info.isBST; } public Info process(TreeNode x){ if(x==null){ return null; } Info leftData=process(x.left); Info rightData=process(x.right); int min=x.val; int max=x.val; if(leftData!=null){ min=Math.min(min,leftData.min); max=Math.max(max,leftData.max); } if(rightData!=null){ min=Math.min(min,rightData.min); max=Math.max(max, rightData.max); } boolean isBST=false; boolean leftFlag = leftData == null || leftData.isBST && leftData.max < x.val; boolean rightFlag= rightData == null || rightData.isBST && rightData.min > x.val; if( leftFlag && rightFlag){ isBST=true; } return new Info(isBST,max,min); } public class Info{ public boolean isBST; public int max; public int min; public Info(boolean isBST,int max,int min){ this.isBST=isBST; this.max=max; this.min=min; } } }