package SearchTree;
/**
* @author 真他喵的学不动咯
* @create 2022-08-16--20:38
*/
public class Ser { //搜索二叉树
//leetcode 98题
public static class TreeNode{
public int val;
public TreeNode left;
public TreeNode right;
TreeNode(int val){
this.val=val;
}
}
//封装三个信息
public static class Info{
public boolean isBST;
public int max;
public int min;
public Info (boolean is,int ma,int mi){
isBST=is;
max=ma;
min=mi;
}
}
public static Info process(TreeNode x) {
if (x==null){ //要考虑如果头结点是负数,那他自己也是搜索二叉树
//所以不能设计为空
return null;
} //不知如何设置就返回了null,还是自己判断是不是null
Info leftInfo=process(x.left);
Info rightInfo=process(x.right);
int max=x.val; //先把最大值设置为x的值,再进行替换
int min=x.val;
if (leftInfo!=null){
max=Math.max(leftInfo.max,max); //左树不空,从左树中找到最大值
min=Math.min(leftInfo.min,min);
}
if (rightInfo!=null){
max=Math.max(rightInfo.max,max); 右树不空,从右树中找到最大值
min=Math.min(rightInfo.min,min);
}
boolean isBST=true; //预设为是搜索二叉树
if (leftInfo!=null&&!leftInfo.isBST){
//如果左树不空而且左树不是搜索二叉树
isBST=false;//那整颗数都不是搜索二叉树
}
if (rightInfo!=null&&!rightInfo.isBST){
//如果左树不空而且左树不是搜索二叉树
isBST=false;//那整颗数都不是搜索二叉树
}
//left Max<x right min>x
//如果左树为空,默认左树的最大值小于x直接返回true,否则真的判断两者之间的关系
boolean leftMaxLessX=leftInfo==null? true:(leftInfo.max<x.val);
//右树同理
boolean rightMinMoreX=rightInfo==null? true:(rightInfo.min<x.val);
if (!leftMaxLessX||!rightMinMoreX){ //有一个不满足,就不是搜索树
isBST=false;
}
return new Info(isBST,max,min); //返回这棵树的三个信息
}
}