解法一
class Solution {
public:
void recoverTree(TreeNode* root) {
vector<TreeNode*> trees;
vector<int> vals;
inorder(root, trees, vals);
sort(vals.begin(), vals.end());
for(int i=0;i<trees.size();i++){
if(trees[i]->val!=vals[i]) trees[i]->val=vals[i];
}
}
void inorder(TreeNode* root, vector<TreeNode*>& trees, vector<int>& vals){
if(!root) return;
inorder(root->left, trees, vals);
trees.push_back(root);
vals.push_back(root->val);
inorder(root->right, trees, vals);
}
};
解法二
class Solution {
public:
void recoverTree(TreeNode* root) {
TreeNode* first=NULL;
TreeNode* second=NULL;
TreeNode* pre = NULL;
inorder(root, pre, first, second);
if(first && second) swap(first->val, second->val);
}
void inorder(TreeNode* root, TreeNode*& pre, TreeNode*& first, TreeNode*& second){
if(!root) return;
inorder(root->left, pre, first, second);
if(!pre) pre=root;
else{
if(pre->val>root->val){
if(!first) first = pre;
second = root;
}
pre = root;
}
inorder(root->right, pre, first, second);
}
};