99 Recover Binary Search Tree
void inOrderTraverse(TreeNode *root, vector<TreeNode*> &nodes) {
if (root) {
inOrderTraverse(root->left, nodes);
nodes.push_back(root);
inOrderTraverse(root->right, nodes);
}
}
void my_swap(TreeNode *r1, TreeNode *r2) {
int temp = r1->val;
r1->val = r2->val;
r2->val = temp;
}
pair<int, int> findMisplacedElements(vector<TreeNode*> nodes) {
assert(nodes.size() > 1);
for (int i = nodes.size() - 1; i > 0; i--) {
if (nodes[i]->val < nodes[i - 1]->val) {
int j = i - 1;
while (j >= 0 && nodes[i]->val < nodes[j]->val)
j--;
return { i, j + 1 };
}
}
}
void recoverTree(TreeNode* root) {
static vector<TreeNode*> nodes;
nodes.clear();
inOrderTraverse(root, nodes);
pair<int, int> misplaced = findMisplacedElements(nodes);
my_swap(nodes[misplaced.first], nodes[misplaced.second]);
}Last updated