# 99-Recover Binary Search Tree
###### tags: `Medium`
* Question:
https://leetcode.com/problems/recover-binary-search-tree/
* Key:
1. 如何用對struct為TreeNode進行遍尋比較?
先輸入root再對左子樹進行遞迴,並且用a, b紀錄要交換的兩節點,遞迴過程中,如果有發現錯誤,就進行記錄到a, b,否則就一直更新root為前一個節點,接著對右子樹進行遞回,這樣才能確保檢查順序為:左>根?->移動節點->根>右?
3. 遍尋後,若發現錯誤,如何做交換?
記錄節點a, b後指向value即可交換
4. 思考:如果題目不止一個錯誤怎麼辦? 遍尋到哪就先做修正(交換),修正後,再繼續遍尋,可以嗎?
5. DFS
* Reference:
1. https://ithelp.ithome.com.tw/articles/10279073?sc=rss.iron
2. https://hwchang0417.wordpress.com/2018/11/07/leetcode-99-recover-binary-search-tree/
* Hint:
1. 要先知道BST的定義:
a. 若任意節點的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值;
b. 若任意節點的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值;
c. 任意節點的左、右子樹也分別為二元搜尋樹;
```cpp=
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void recover(TreeNode* r, TreeNode* &prev, TreeNode* &a, TreeNode* &b){
if(r){
recover(r->left, prev, a, b);
if(r->val < prev->val){
if(!a) a = prev;
b = r;
}
prev = r;
recover(r->right, prev, a, b);
}
}
void recoverTree(TreeNode* root) {
TreeNode p(INT_MIN);
TreeNode *a = NULL, *b = NULL, *prev = &p;
recover(root, prev, a, b);
if(a && b){
int tmp = a->val;
a->val = b->val;
b->val = tmp;
}
}
};
```