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
1:中序遍历查找两个节点;2:交换这两个节点的值
void recoverTree(TreeNode *root)
{
if(root == NULL || (!root->left && !root->right))
{
return;
}
TreeNode *preNode = NULL;
TreeNode *firstNode = NULL;
TreeNode *secondNode = NULL;
findTwoNode(root, preNode, firstNode, secondNode);
swap(firstNode->val, secondNode->val);
return;
}
void findTwoNode(TreeNode *root, TreeNode * &preNode, TreeNode *&firstNode, TreeNode *&secondNode)
{
if(root->left)
{
findTwoNode(root->left, preNode, firstNode, secondNode);
}
if(preNode == NULL)
{
preNode = root;
}
else
{
if(preNode->val > root->val)
{
if(firstNode == NULL)
{
firstNode = preNode;
}
secondNode = root;
}
preNode = root;
}
if(root->right)
{
findTwoNode(root->right, preNode, firstNode, secondNode);
}
}