import java.util.ArrayList;

public class VaildateBST {
    //方法一:先序遍历
    public boolean isValidBST1(TreeNode root) {
        if(root==null) return true;

        return validator(root,null,null);
    }

    //定义一个辅助检验器,用来传入上下界递归调用
    public boolean validator(TreeNode root,Integer lowerBound,Integer upperBound){
        if(root==null) return true;

        //1.判断当前节点的值是否在上下界范围内,如果超出直接返回false
        if(lowerBound!=null&&root.val<=lowerBound)return false;
        if(upperBound!=null&&root.val>=upperBound)return false;

        //2.递归判断左右子树
        return validator(root.left,lowerBound,root.val)&&validator(root.right,root.val,upperBound);
    }

    //定义一个列表
    ArrayList<Integer> inOrderArray = new ArrayList<>();

    //方法二:中序遍历,因为二叉搜索树的排序是一个递增的
    public boolean isValidBST(TreeNode root) {
        //1.中序遍历,得到升序数组
        inOrder(root);

        //2.遍历数组,判断是否升序
        for (int i = 0; i <inOrderArray.size() ; i++) {
            if(i>0&&inOrderArray.get(i)<=inOrderArray.get(i-1)){
                return false;
            }
        }
        return true;
    }

    //实现一个中序遍历的方法
    public void inOrder(TreeNode root){
        if(root==null) return;
        inOrder(root.left);
        inOrderArray.add(root.val);
        inOrder(root.right);
    }

    public static void main(String[] args) {
        TreeNode node1 = new TreeNode(5);
        TreeNode node2 = new TreeNode(1);
        TreeNode node3 = new TreeNode(4);
        TreeNode node4 = new TreeNode(3);
        TreeNode node5 = new TreeNode(6);

        node1.left = node2;
        node1.right = node3;
        node3.left=node4;
        node3.right=node5;

        VaildateBST vaildateBST = new VaildateBST();
        System.out.println(vaildateBST.isValidBST(node1));
    }
}