Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Note:A solution using O( n ) space is pretty straight forward. Could you devise a constant space solution?
class Solution {
public:
void recoverTree(TreeNode* root) {
//vector<int>re;
vector<TreeNode*>que;
TreeNode*pre = NULL,*n1(NULL),*n2(NULL),*n3(NULL);
que.push_back(root);
bool f = true;
while (!que.empty()&&(n2==NULL))
{
if (f&&que.back()->left != NULL)
que.push_back(que.back()->left);
else
{
//re.push_back(que.back()->val);
TreeNode*n = que.back();
que.pop_back();
if (pre != NULL)
{
if (n->val <= pre->val&&n1 == NULL)
{
n1 = pre;
n3 = n;
}
else if (n->val <= pre->val)
n2 = n;
}
if (n->right != NULL)
{
que.push_back(n->right);
f = true;
}
else
f = false;
pre = n;
}
}
if (n2 == NULL)
{
int t = n1->val;
n1->val = n3->val;
n3->val = t;
}
else
{
int t = n1->val;
n1->val = n2->val;
n2->val = t;
}
}
};
accepted