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?
confused what "{1,#,2,3}"
means? > read more on how binary tree is serialized on OJ.
class Solution {
public:
void recoverTree(TreeNode *root) {
if(root == NULL)return;
TreeNode* pre = NULL,*n1 = NULL,*n2 = NULL;
findTwoNode(root,n1,n2,pre);
if(n1 && n2)
{
int temp = n1->val;
n1->val = n2->val;
n2->val = temp;
}
}
void findTwoNode(TreeNode* root,TreeNode* &n1,TreeNode* &n2,TreeNode* &pre)
{
if(root == NULL)return;
findTwoNode(root->left,n1,n2,pre);
if(pre && pre->val > root->val)
{
n2 = root;//第二个出错位置是该节点的后序
if(n1 == NULL)
{
n1 = pre;//第一个出错位置是该节点的先序
}
}
pre = root;
findTwoNode(root->right,n1,n2,pre);
}
};
下面是堆栈实现,思路一样:
struct TreeNode {
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
class Solution {
public:
void recoverTree(TreeNode *root) {
if(!root)return;
stack<TreeNode*> s;
TreeNode* p = root , *pre = NULL ,*node1 = NULL,*node2 = NULL;
while(p || !s.empty())
{
while( p )
{
s.push(p);
p = p -> left;
}
p = s.top();
s.pop();
if(pre && pre -> val > p -> val)
{
if( !node1 )node1 = pre;
node2 = p;
}
pre = p;
p = p -> right;
}
if(node1 && node2) swap(node1 -> val,node2 -> val);
}
};