https://leetcode.com/problems/recover-binary-search-tree/

1. Use inorder traversal:

  1. //32 ms 53.3 MB
  2. /**
  3. * Definition for a binary tree node.
  4. * struct TreeNode {
  5. * int val;
  6. * TreeNode *left;
  7. * TreeNode *right;
  8. * TreeNode() : val(0), left(nullptr), right(nullptr) {}
  9. * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
  10. * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
  11. * };
  12. */
  13. class Solution {
  14. public:
  15. void recoverTree(TreeNode* root) {
  16. inorder(root);
  17. swap(first->val, second->val);
  18. }
  19. void inorder(TreeNode* root) {
  20. if(!root) return;
  21. inorder(root->left);
  22. if(prev && prev->val > root->val){
  23. if(!first) first = prev;
  24. second = root;
  25. }
  26. prev = root;
  27. inorder(root->right);
  28. }
  29. private:
  30. TreeNode* first;
  31. TreeNode* second;
  32. TreeNode* prev;
  33. };

Time complexity: O(n)
Space complexity: O(h)