// 如果交换的是两个相邻的数,则只能找到一个异常点; // 如果交换的不是相邻的数,则能找到2个异常点 pair<int, int> findTwo(const vector<int> &nums){ int index1 = -1, index2 = -1; for (int i = 0; i < nums.size()-1; i++) { if (nums[i+1] < nums[i]) { index2 = i+1; // index1再次出现 说明找到了第二个异常的数 if (index1 == -1) { index1 = i; }else{ break; } } } return {nums[index1], nums[index2]}; }
voidrecover(TreeNode* root, int x, int y, int count){ if (root == nullptr) return; if (root->val == x || root->val == y) { root->val = root->val == x ? y : x; if (--count == 0) return; } recover(root->left, x, y, count); recover(root->right, x, y, count); } public: voidrecoverTree(TreeNode* root){ vector<int> treeNums; inOrder(root, treeNums); auto two = findTwo(treeNums); recover(root, two.first, two.second, 2); } };