wo 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?
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
SOLUTION: use inorder traversal to check whether every node is in increasing order. Keep two pointers to the nodes out of order.
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
//return the previous visited node
TreeNode* inorder(TreeNode *root,TreeNode *prev, TreeNode*& n1, TreeNode*& n2)
{
if(root==NULL) return prev;
prev=inorder(root->left,prev,n1,n2);
//check whether the root is out of order
if(prev!=NULL && root->val < prev->val)
{
if(n1==NULL)
n1=prev;
//swap nodes
n2=root;
}
prev=root;
return inorder(root->right,prev,n1,n2);
}
void recoverTree(TreeNode *root) {
// Start typing your C/C++ solution below
// DO NOT write int main() function
TreeNode *n1=NULL;
TreeNode *n2=NULL;
TreeNode *parent=NULL;
inorder(root,parent,n1,n2);
if(n1!=NULL && n2!=NULL)
{
int tmp=n1->val;
n1->val=n2->val;
n2->val=tmp;
}
}
};