/**
 * struct TreeNode {
 *	int val;
 *	struct TreeNode *left;
 *	struct TreeNode *right;
 *	TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 * };
 */
#include <climits>
class Solution {
public: 
    //这个数比后面的数大,则这是交换的数中大的那个数;
    //这个数比前面的数小则,这是交换的数中小的那个数;
    vector<int> findError(TreeNode* root) {
        if(!root){
            return {};
        }

        vector<int> ans(2);

        find_two(ans, root);

        return ans;
    }

    void find_two(vector<int>& ans, TreeNode* root){
        int index = 1;
        TreeNode* pre_node = nullptr;
        TreeNode* curr = root;  //作为我们要处理的节点

        stack<TreeNode*> stk;
        //层序遍历使用队列,先入队初始化,再遍历;
        //中序遍历使用栈,栈初始为空;
        while(curr || !stk.empty()){  //要么使用curr有节点的情况,或者是栈有节点的情况;
            while( curr ){     //不应该检测栈顶节点是否有左节点,不然左节点会重复入栈
                stk.push(curr);
                curr = curr->left;
            }

            curr = stk.top();stk.pop();
          //交换的较大值在前面,比左右两边大,交换的较小值在后面,比左右两边小;
		  //第一次遇到后值小的,则较大的交换值就确定了,后续遇到后值小的情况时,只需更新较小值,
            if(pre_node && curr->val < pre_node->val){
                if(index == 1){
                    ans[index] = pre_node->val;
                    ans[0] = curr->val;
                    index = 0;
                }else{
                    ans[0] = curr->val;
                }
            }
            pre_node = curr;

            curr = curr->right;  
        }
    }
};