/**
* struct TreeNode {
* int val;
* struct TreeNode *left;
* struct TreeNode *right;
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param root TreeNode类 the root
* @return int整型vector
*/
TreeNode* prev; // 上一个中序节点
TreeNode* first; // 第一次逆序时的前一个
TreeNode* second; // 最后一次逆序时的当前
vector<int> findError(TreeNode* root) {
// write code here
first = second = prev= nullptr;
inorder(root);
int a = first->val, b = second->val;
if (a > b) swap(a, b);
return {a, b};
}
void inorder(TreeNode* node) {
if (!node) return;
inorder(node->left);
if (prev && prev->val > node->val) {
if (!first) first = prev; // 第一次发现逆序
second = node; // 每次逆序都更新 second
}
prev = node;
inorder(node->right);
}
};