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.
OJ's Binary Tree Serialization:
The serialization of a binary tree follows a level order traversal, where '#' signifies a path terminator where no node exists below.
Here's an example:
1 / \ 2 3 / 4 \ 5The above binary tree is serialized as
"{1,2,3,#,#,4,#,#,5}"
.
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
void recoverTree(TreeNode* root) {
TreeNode *pre = NULL, *left = NULL, *right = NULL;
dfs(root, left, right, pre);
if(left && right)
{
int temp = left->val;
left->val = right->val;
right->val = temp;
}
}
void dfs(TreeNode *root, TreeNode *&left, TreeNode *&right, TreeNode *&pre)
{
if(!root) return ;
dfs(root->left, left, right, pre);
if(pre && pre->val > root->val)
{
if(!left) left = pre;
right = root;
}
pre = root;
dfs(root->right, left, right, pre);
}
};