import java.util.*;

/*
 * public class TreeNode {
 *   int val = 0;
 *   TreeNode left = null;
 *   TreeNode right = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param root TreeNode类 the root
     * @return int整型一维数组
     */
    //思想就是:二叉搜索树的中序遍历应该是单调递增序列,调换两个节点后,
    //原来递增的序列一定会产生两个 逆序对,每一对中必定有一个错误的数字。
    public int[] findError (TreeNode root) {
        int ans[] = new int[2] ;
        boolean findFirst = false ;//是否找到第一个错位的数字
        int last = -1 ;//记录中序遍历过程中上一次的 值
        Stack<TreeNode> st = new Stack<>() ;
        TreeNode t = root ;
        while(!st.isEmpty() || t != null) {
            while(t != null) {
                st.push(t) ;
                t = t.left ;
            }
            t = st.pop() ;
            //处理
            if(t.val < last) {//如果出现逆序,则挑出错误的 数字
                if(findFirst) {
                    ans[0] = t.val ;
                } else {
                    findFirst = true ;
                    ans[1] = last ;
                }
            }
            last = t.val ;
            t = t.right ;
        }
        return ans ; 
    }
}