---
link: https://leetcode.com/problems/recover-binary-search-tree/
tags: tree, bst, hard
---
# 99. Recover Binary Search Tree
## Question
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?
## Solution
```python=
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def recoverTree(self, root):
self.unordered_nodes = []
self.prev = None
self.helper(root)
_ = self.unordered_nodes[0].val
self.unordered_nodes[0].val = self.unordered_nodes[1].val
self.unordered_nodes[1].val = _
def helper(self, curr):
if curr is None:
return
self.helper(curr.left)
if self.prev and self.prev.val > curr.val:
if not self.unordered_nodes:
self.unordered_nodes = [self.prev, curr]
else:
self.unordered_nodes[-1] = curr
self.prev = curr
self.helper(curr.right)
def recoverTree_nlogn(self, root):
"""
:type root: TreeNode
:rtype: None Do not return anything, modify root in-place instead.
"""
self.list = []
self.inorderTraversal(root) # Inorder traversal of a BST is a sorted list.
sorted_list = sorted(self.list)
unordered_nodes = []
for idx in range(len(self.list)):
if self.list[idx][0] != sorted_list[idx][0]:
unordered_nodes.append(self.list[idx][1])
if len(unordered_nodes) == 2:
break
_ = unordered_nodes[0].val
unordered_nodes[0].val = unordered_nodes[1].val
unordered_nodes[1].val = _
def inorderTraversal_nlogn(self, node):
if node is None:
return
self.inorderTraversal(node.left)
self.list.append((node.val, node))
self.inorderTraversal(node.right)
```
## Solution: Java
```java=
```