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布尔型
     */
    public boolean isValidBST (TreeNode root) {
        // write code here
        boolean reslut = true;

        TreeNode start = root;
        while(start.left != null){ //获取双向链表的头结点
            start = start.left;
        }

        midOrder(root);//中序遍历,重组双向链表,val满足升序排序,则是二叉树搜索树,左节点值都小于右节点值

        TreeNode temp = start;
        while(temp.right != null){//利用指针遍历双向列表,如出当前值大于right值,则不满足二叉树搜索树的规则
            if(temp.val > temp.right.val){
                reslut = false;
                break;
            }
            temp = temp.right;
        }

        return reslut;
    }

    TreeNode pointer = null;

    private void midOrder(TreeNode target){
        if(target == null) return;

        midOrder(target.left);
        target.left = pointer;
        if(pointer != null){
            pointer.right = target;
        }
        pointer = target;//指针后移
        midOrder(target.right);

    }
}