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?
因为是BST, 所以需要用到inorder traversal来判断是哪两个点需要交换, 因此, 我们用pre来记录之前遍历的node, 然后第一个pre.val > node.val, 表明pre为第一个不对的node.
然后通过同样的道理, 如果第一个找到了, 我们就不断通过pre.val > node.val 这一条件将node更新为第二个点.最后将第一个点和第二个点交换, 即可.
1. Constriants
1) None => Nothing
2. Ideas
Inorder traversal T; O(n) S; O(1)
3. Code
class Solution: def recoverBST(self, root): ans = [None, None, None] #firNode, secNode, pre def helper(node): if not node: return helper(node.left) if not ans[0] and ans[2] and ans[2].val > node.val: ans[0] = ans[2] if ans[0] and ans[2] and ans[2].val > node.val: ans[0] = node ans[2] = node helper(node.right) helper(root) ans[0].val, ans[1].val = ans[1].val, ans[0].val
4. Test cases
1)
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