42
42
43
43
<!-- 这里可写通用的实现逻辑 -->
44
44
45
+ ** 方法一:中序遍历**
46
+
47
+ 中序遍历二叉搜索树,得到的序列是递增的。如果有两个节点的值被错误地交换,那么中序遍历得到的序列中,一定会出现两个逆序对。我们用 ` first ` 和 ` second ` 分别记录这两个逆序对中较小值和较大值的节点,最后交换这两个节点的值即可。
48
+
49
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉搜索树的节点个数。
50
+
45
51
<!-- tabs:start -->
46
52
47
53
### ** Python3**
@@ -60,18 +66,17 @@ class Solution:
60
66
"""
61
67
Do not return anything, modify root in-place instead.
62
68
"""
63
-
64
69
def dfs (root ):
70
+ if root is None :
71
+ return
65
72
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)
75
80
76
81
prev = first = second = None
77
82
dfs(root)
@@ -115,13 +120,11 @@ class Solution {
115
120
return ;
116
121
}
117
122
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 ) {
120
125
first = prev;
121
126
}
122
- if (first != null && prev. val > root. val) {
123
- second = root;
124
- }
127
+ second = root;
125
128
}
126
129
prev = root;
127
130
dfs(root. right);
@@ -145,25 +148,23 @@ class Solution {
145
148
*/
146
149
class Solution {
147
150
public:
148
- TreeNode* prev;
149
- TreeNode* first;
150
- TreeNode* second;
151
-
152
151
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
+ };
153
165
dfs(root);
154
166
swap(first->val, second->val);
155
167
}
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
- }
167
168
};
168
169
```
169
170
@@ -179,28 +180,22 @@ public:
179
180
* }
180
181
*/
181
182
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)
187
185
dfs = func(root *TreeNode) {
188
186
if root == nil {
189
187
return
190
188
}
191
189
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 {
194
192
first = prev
195
193
}
196
- if first != nil && prev.Val > root.Val {
197
- second = root
198
- }
194
+ second = root
199
195
}
200
196
prev = root
201
197
dfs(root.Right)
202
198
}
203
-
204
199
dfs(root)
205
200
first.Val, second.Val = second.Val, first.Val
206
201
}
@@ -233,23 +228,18 @@ public class Solution {
233
228
}
234
229
235
230
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 ;
249
238
}
250
- prev = root ;
251
- dfs (root .right );
239
+ second = root ;
252
240
}
241
+ prev = root ;
242
+ dfs (root .right );
253
243
}
254
244
}
255
245
```
@@ -269,34 +259,28 @@ public class Solution {
269
259
* @param {TreeNode} root
270
260
* @return {void} Do not return anything, modify root in-place instead.
271
261
*/
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 );
295
279
}
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 ;
300
284
};
301
285
```
302
286
0 commit comments