Skip to content

Commit 1e065ab

Browse files
committed
feat: add solutions to lc problem: No.0099
No.0099.Recover Binary Search Tree
1 parent ace0342 commit 1e065ab

File tree

8 files changed

+189
-249
lines changed

8 files changed

+189
-249
lines changed

solution/0000-0099/0099.Recover Binary Search Tree/README.md

+67-83
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,12 @@
4242

4343
<!-- 这里可写通用的实现逻辑 -->
4444

45+
**方法一:中序遍历**
46+
47+
中序遍历二叉搜索树,得到的序列是递增的。如果有两个节点的值被错误地交换,那么中序遍历得到的序列中,一定会出现两个逆序对。我们用 `first``second` 分别记录这两个逆序对中较小值和较大值的节点,最后交换这两个节点的值即可。
48+
49+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉搜索树的节点个数。
50+
4551
<!-- tabs:start -->
4652

4753
### **Python3**
@@ -60,18 +66,17 @@ class Solution:
6066
"""
6167
Do not return anything, modify root in-place instead.
6268
"""
63-
6469
def dfs(root):
70+
if root is None:
71+
return
6572
nonlocal prev, first, second
66-
if root:
67-
dfs(root.left)
68-
if prev:
69-
if first is None and root.val < prev.val:
70-
first = prev
71-
if first and root.val < prev.val:
72-
second = root
73-
prev = root
74-
dfs(root.right)
73+
dfs(root.left)
74+
if prev and prev.val > root.val:
75+
if first is None:
76+
first = prev
77+
second = root
78+
prev = root
79+
dfs(root.right)
7580

7681
prev = first = second = None
7782
dfs(root)
@@ -115,13 +120,11 @@ class Solution {
115120
return;
116121
}
117122
dfs(root.left);
118-
if (prev != null) {
119-
if (first == null && prev.val > root.val) {
123+
if (prev != null && prev.val > root.val) {
124+
if (first == null) {
120125
first = prev;
121126
}
122-
if (first != null && prev.val > root.val) {
123-
second = root;
124-
}
127+
second = root;
125128
}
126129
prev = root;
127130
dfs(root.right);
@@ -145,25 +148,23 @@ class Solution {
145148
*/
146149
class Solution {
147150
public:
148-
TreeNode* prev;
149-
TreeNode* first;
150-
TreeNode* second;
151-
152151
void recoverTree(TreeNode* root) {
152+
TreeNode* prev = nullptr;
153+
TreeNode* first = nullptr;
154+
TreeNode* second = nullptr;
155+
function<void(TreeNode* root)> dfs = [&](TreeNode* root) {
156+
if (!root) return;
157+
dfs(root->left);
158+
if (prev && prev->val > root->val) {
159+
if (!first) first = prev;
160+
second = root;
161+
}
162+
prev = root;
163+
dfs(root->right);
164+
};
153165
dfs(root);
154166
swap(first->val, second->val);
155167
}
156-
157-
void dfs(TreeNode* root) {
158-
if (!root) return;
159-
dfs(root->left);
160-
if (prev) {
161-
if (!first && prev->val > root->val) first = prev;
162-
if (first && prev->val > root->val) second = root;
163-
}
164-
prev = root;
165-
dfs(root->right);
166-
}
167168
};
168169
```
169170
@@ -179,28 +180,22 @@ public:
179180
* }
180181
*/
181182
func recoverTree(root *TreeNode) {
182-
var prev *TreeNode
183-
var first *TreeNode
184-
var second *TreeNode
185-
186-
var dfs func(root *TreeNode)
183+
var prev, first, second *TreeNode
184+
var dfs func(*TreeNode)
187185
dfs = func(root *TreeNode) {
188186
if root == nil {
189187
return
190188
}
191189
dfs(root.Left)
192-
if prev != nil {
193-
if first == nil && prev.Val > root.Val {
190+
if prev != nil && prev.Val > root.Val {
191+
if first == nil {
194192
first = prev
195193
}
196-
if first != nil && prev.Val > root.Val {
197-
second = root
198-
}
194+
second = root
199195
}
200196
prev = root
201197
dfs(root.Right)
202198
}
203-
204199
dfs(root)
205200
first.Val, second.Val = second.Val, first.Val
206201
}
@@ -233,23 +228,18 @@ public class Solution {
233228
}
234229

235230
private void dfs(TreeNode root) {
236-
if (root != null)
237-
{
238-
dfs(root.left);
239-
if (prev != null)
240-
{
241-
if (first == null && prev.val > root.val)
242-
{
243-
first = prev;
244-
}
245-
if (first != null && prev.val > root.val)
246-
{
247-
second = root;
248-
}
231+
if (root == null) {
232+
return;
233+
}
234+
dfs(root.left);
235+
if (prev != null && prev.val > root.val) {
236+
if (first == null) {
237+
first = prev;
249238
}
250-
prev = root;
251-
dfs(root.right);
239+
second = root;
252240
}
241+
prev = root;
242+
dfs(root.right);
253243
}
254244
}
255245
```
@@ -269,34 +259,28 @@ public class Solution {
269259
* @param {TreeNode} root
270260
* @return {void} Do not return anything, modify root in-place instead.
271261
*/
272-
const recoverTree = root => {
273-
const data = {
274-
prev: null,
275-
first: null,
276-
second: null,
277-
};
278-
let tmp = 0;
279-
280-
helper(root, data);
281-
282-
tmp = data.first.val;
283-
data.first.val = data.second.val;
284-
data.second.val = tmp;
285-
};
286-
287-
const helper = (root, data) => {
288-
if (!root) return;
289-
290-
helper(root.left, data);
291-
292-
if (data.prev && data.prev.val >= root.val) {
293-
if (!data.first) data.first = data.prev;
294-
data.second = root;
262+
var recoverTree = function (root) {
263+
let prev = null;
264+
let first = null;
265+
let second = null;
266+
function dfs(root) {
267+
if (!root) {
268+
return;
269+
}
270+
dfs(root.left);
271+
if (prev && prev.val > root.val) {
272+
if (!first) {
273+
first = prev;
274+
}
275+
second = root;
276+
}
277+
prev = root;
278+
dfs(root.right);
295279
}
296-
297-
data.prev = root;
298-
299-
helper(root.right, data);
280+
dfs(root);
281+
const t = first.val;
282+
first.val = second.val;
283+
second.val = t;
300284
};
301285
```
302286

0 commit comments

Comments
 (0)