题意:给你一个BST,其中任意两个元素被交换过了,让你把交换的元素复原。
题解:BST的中序遍历是个有序的数组,那么两个元素被交换了,我们可以for循环一次找出这两个数字。从小到大遍历,维护一个值max,表示当前遍历元素的最大值。由于两个元素被交换了,所以max一定有一段时间是不变的,直到遇到一个比max大的元素,那么max就应该和这个最大的元素之前一个元素交换过来。当然如果遍历结束了还没有比max大的,那么max就是最大的,所以交换最后一个元素就可以了。
以上操作可以在中序遍历的过程中完成。
c++
```
/**
- 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:TreeNode* last;
TreeNode* pre;int tag=0;
int ans=0;int m = -123987523;
void recoverTree(TreeNode* root) {if(root==NULL) return; last = new TreeNode(m); fun(root); if(ans==0) { int temp = pre->val; pre->val = last->val; last->val = temp; }
}
void fun(TreeNode* root)
{
if(root->left!=NULL)
{
fun(root->left);
}if(last->val == m ) { last=root; } else if(last->val<root->val) { if(tag==1) { int temp = pre->val; pre->val = last->val; last->val = temp; ans=1; } last=root; tag=0; } else { tag=1; } pre=root; if(root->right!=NULL) { fun(root->right); }
}
};
```