思路:
1.二叉搜索树,左边的节点比根小,右边的节点比根大。中序遍历的结果是从小到大排序的
2.递归,树的中序遍历,拿到中间节点后,比较是否当前的数比前面的数小,小就不是二叉搜索树
3.看之前的中序遍历TOP24,我们还可以用栈的做法实现。

import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 *   public TreeNode(int val) {
 *     this.val = val;
 *   }
 * }
 */

public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param root TreeNode类
     * @return bool布尔型
     */
    int pre = Integer.MIN_VALUE;
    public boolean isValidBST (TreeNode root) {
        // write code here
        //方法二
        return isValidBFS(root);
        //方法一
//         if (root == null) {
//             return true;
//         }
//         //左
//         if (!isValidBST(root.left)) {
//             return false;
//         }
//         //根
//         if (root.val < pre) {
//             return false;
//         }
//         pre = root.val;
//         //右
//         if (!isValidBST(root.right)) {
//             return false;
//         }
//         return true;
    }

    private boolean isValidBFS(TreeNode node) {
        if (node == null) {
            return true;
        }
        //假设根的值最小,左子树最左一个节点开始
        int pre = Integer.MIN_VALUE;

        Stack<TreeNode> stack = new Stack<>();
        TreeNode currentNode = node;
        while (currentNode != null || !stack.empty()) {

            while (currentNode != null) {
                stack.push(currentNode);
                currentNode = currentNode.left;
            }
            currentNode = stack.pop();
            //最后一个左节点
            if (currentNode.val < pre) {
                return false;
            }
            pre = currentNode.val;
            //左节点的右节点
            currentNode = currentNode.right;

        }
        return true;

    }
}