题目:
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?
分析:先遍历一遍树的节点,用两个整数标记发生交换的节点;接着再遍历一遍树的节点,更改交换。
代码如下:
void changeTree(TreeNode *root,int &first,int &end)
{
if(root->left!=NULL)
{
changeTree(root->left,first,end);
}
if(root->val==first)
{
root->val=end;
}
else if(root->val==end)
{
root->val=first;
return;
}
if(root->right!=NULL)
{
changeTree(root->right,first,end);
}
return;
}
void getinvalidnode(TreeNode *root,int &first,int ¤t,int &end,bool &flag)
{
if(root->left!=NULL)
{
getinvalidnode(root->left,first,current,end,flag);
}
if(current==-1)
{
current=root->val;
}
else
{
if(root->val<current&&(!flag))
{
first=current;
end=root->val;
flag=true;
}
else if(root->val<current&&flag)
{
end=root->val;
return;
}
current=root->val;
}
if(root->right!=NULL)
{
getinvalidnode(root->right,first,current,end,flag);
}
return;
}
void recoverTree(TreeNode *root) {
if(root==NULL)return;
int first=-1,current=-1,end=-1;
bool flag=false;
getinvalidnode(root,first,current,end,flag);
if(first!=-1&&end!=-1)
changeTree(root,first,end);
return;
}