Two elements of a binary search tree (BST) are swapped by mistake.
Recover the tree without changing its structure.
Example 1:
Input: [1,3,null,null,2] 1 / 3 \ 2 Output: [3,1,null,null,2] 3 / 1 \ 2
Example 2:
Input: [3,1,4,null,null,2] 3 / \ 1 4 / 2 Output: [2,1,4,null,null,3] 2 / \ 1 4 / 3
Follow up:
- A solution using O(n) space is pretty straight forward.
- Could you devise a constant space solution?
思路:
使用递归的方式遍历二叉树,当遇到逆序的时候就将逆序的值的地址记录下来。为了传递值得地址,我们需要用到指针的引用。代码如下:
void helper(TreeNode* root, int *&val, int *&first, int *&second){
if (!root) return;
if (root->left) helper(root->left, val, first, second);
if (!val) val = &root->val;
else if (root->val < *val && !first) {
first = val; second = &root->val;
}
else if (root->val < *val) {
second = &root->val; return;
}
val = &root->val;
if (root->right) helper(root->right, val, first, second);
}
void recoverTree(TreeNode* root) {
int *val = NULL, *first = NULL, *second = NULL;
helper(root, val, first, second);
int temp = *first;
*first = *second;
*second = temp;
}
纪念贴图: