> 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?
Copy void inorder1(vector<TreeNode*> &result, TreeNode* root)
{
if(root->left) inorder1(result, root->left);
result.push_back(root);
if(root->right) inorder1(result, root->right);
}
void recoverTree1(TreeNode *root)
{
if (root == NULL) return;
vector<TreeNode*> inorder_result;
inorder1(inorder_result, root);
TreeNode* firstWrong = NULL, *secondWrong = NULL;
vector<TreeNode*>::iterator it;
for(it = inorder_result.begin(); it != inorder_result.end()-1; it++)
{
if((*it)->val >= (*(it+1))->val)
{
firstWrong = *it;
break;
}
}
for(auto it2 = inorder_result.end()-1; it2 != it; it2--)
{
if((*it2)->val <= (*(it2-1))->val)
{
secondWrong = *it2;
break;
}
}
//swap
int tmp = firstWrong->val;
firstWrong->val = secondWrong->val;
secondWrong->val = tmp;
}
Copy void recoverTree(TreeNode *root)
{
if(root == NULL) return;
stack<TreeNode*> stacks;
TreeNode tmp(INT_MIN);
TreeNode * last = &tmp;
TreeNode * node1 = NULL, *node2 = NULL;
TreeNode * node = root;
while(true)
{
if(node)
{
stacks.push(node);
node = node->left;
}
else
{
if(stacks.empty()) break;
node = stacks.top(); stacks.pop();
if(last->val >= node->val)
{
if(node1 == NULL)
{node1 = last; node2=node;}//3,2
else
node2 = node;
}
last = node;
node = node->right;
}
}
std::swap(node1->val, node2->val);
}
Copy void recoverTree(TreeNode *root)
{
if(root == NULL) return;
TreeNode* node1 = NULL, *node2 = NULL;
TreeNode * pre = NULL;
TreeNode * node = root;
TreeNode tmp(INT_MIN);
TreeNode * last = &tmp;
while(node)
{
if(node->left == NULL)
{
//visit node
if(last->val >= node->val){
if(node1 == NULL)
{node1 = last; node2 = node;}
else
node2 = node;//can not break;
}
last = node;
node = node->right;
}
else
{
pre = node->left;
while(pre->right != NULL && pre->right != node)
pre = pre->right;
if(pre->right == NULL)
{
pre->right = node;
node = node->left;
}
else
{
pre->right = NULL;
//visit node
if(last->val >= node->val){
if(node1 == NULL)
{node1 = last; node2 = node;}
else
node2 = node;//can not break;
}
last = node;
node = node->right;
}
}
}
std::swap(node1->val, node2->val);
}