61
61
62
62
### 方法一:中序遍历
63
63
64
- 中序遍历二叉搜索树,获取当前节点与上个节点差值的最小值即可。
64
+ 题目需要我们求任意两个节点值之间的最小差值,而二叉搜索树的中序遍历是一个递增序列,因此我们只需要求中序遍历中相邻两个节点值之间的最小差值即可。
65
+
66
+ 我们可以使用递归的方法来实现中序遍历,过程中用一个变量 $\textit{pre}$ 来保存前一个节点的值,这样我们就可以在遍历的过程中求出相邻两个节点值之间的最小差值。
67
+
68
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉搜索树的节点个数。
65
69
66
70
<!-- tabs:start -->
67
71
@@ -75,17 +79,18 @@ tags:
75
79
# self.left = left
76
80
# self.right = right
77
81
class Solution :
78
- def getMinimumDifference (self , root : TreeNode) -> int :
79
- def dfs (root ):
82
+ def getMinimumDifference (self , root : Optional[ TreeNode] ) -> int :
83
+ def dfs (root : Optional[TreeNode] ):
80
84
if root is None :
81
85
return
82
86
dfs(root.left)
83
- nonlocal ans, prev
84
- ans = min (ans, abs (prev - root.val) )
85
- prev = root.val
87
+ nonlocal pre, ans
88
+ ans = min (ans, root.val - pre )
89
+ pre = root.val
86
90
dfs(root.right)
87
91
88
- ans = prev = inf
92
+ pre = - inf
93
+ ans = inf
89
94
dfs(root)
90
95
return ans
91
96
```
@@ -109,13 +114,11 @@ class Solution:
109
114
* }
110
115
*/
111
116
class Solution {
112
- private int ans ;
113
- private int prev ;
114
- private int inf = Integer . MAX_VALUE ;
117
+ private final int inf = 1 << 30 ;
118
+ private int ans = inf ;
119
+ private int pre = - inf ;
115
120
116
121
public int getMinimumDifference (TreeNode root ) {
117
- ans = inf;
118
- prev = inf;
119
122
dfs(root);
120
123
return ans;
121
124
}
@@ -125,8 +128,8 @@ class Solution {
125
128
return ;
126
129
}
127
130
dfs(root. left);
128
- ans = Math . min(ans, Math . abs( root. val - prev) );
129
- prev = root. val;
131
+ ans = Math . min(ans, root. val - pre );
132
+ pre = root. val;
130
133
dfs(root. right);
131
134
}
132
135
}
@@ -148,23 +151,21 @@ class Solution {
148
151
*/
149
152
class Solution {
150
153
public:
151
- const int inf = INT_MAX;
152
- int ans;
153
- int prev;
154
-
155
154
int getMinimumDifference(TreeNode* root) {
156
- ans = inf, prev = inf;
157
- dfs(root);
155
+ const int inf = 1 << 30;
156
+ int ans = inf, pre = -inf;
157
+ auto dfs = [ &] (auto&& dfs, TreeNode* root) -> void {
158
+ if (!root) {
159
+ return;
160
+ }
161
+ dfs(dfs, root->left);
162
+ ans = min(ans, root->val - pre);
163
+ pre = root->val;
164
+ dfs(dfs, root->right);
165
+ };
166
+ dfs(dfs, root);
158
167
return ans;
159
168
}
160
-
161
- void dfs (TreeNode* root) {
162
- if (!root) return;
163
- dfs(root->left);
164
- ans = min(ans, abs(prev - root->val));
165
- prev = root->val;
166
- dfs(root->right);
167
- }
168
169
};
169
170
```
170
171
@@ -180,27 +181,53 @@ public:
180
181
* }
181
182
*/
182
183
func getMinimumDifference(root *TreeNode) int {
183
- inf := 0x3f3f3f3f
184
- ans, prev := inf, inf
184
+ const inf int = 1 << 30
185
+ ans, pre := inf, - inf
185
186
var dfs func(*TreeNode)
186
187
dfs = func(root *TreeNode) {
187
188
if root == nil {
188
189
return
189
190
}
190
191
dfs(root.Left)
191
- ans = min(ans, abs(prev- root.Val) )
192
- prev = root.Val
192
+ ans = min(ans, root.Val-pre )
193
+ pre = root.Val
193
194
dfs(root.Right)
194
195
}
195
196
dfs(root)
196
197
return ans
197
198
}
199
+ ```
198
200
199
- func abs(x int) int {
200
- if x < 0 {
201
- return -x
202
- }
203
- return x
201
+ #### TypeScript
202
+
203
+ ``` ts
204
+ /**
205
+ * Definition for a binary tree node.
206
+ * class TreeNode {
207
+ * val: number
208
+ * left: TreeNode | null
209
+ * right: TreeNode | null
210
+ * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
211
+ * this.val = (val===undefined ? 0 : val)
212
+ * this.left = (left===undefined ? null : left)
213
+ * this.right = (right===undefined ? null : right)
214
+ * }
215
+ * }
216
+ */
217
+
218
+ function getMinimumDifference(root : TreeNode | null ): number {
219
+ let [ans, pre] = [Infinity , - Infinity ];
220
+ const dfs = (root : TreeNode | null ) => {
221
+ if (! root ) {
222
+ return ;
223
+ }
224
+ dfs (root .left );
225
+ ans = Math .min (ans , root .val - pre );
226
+ pre = root .val ;
227
+ dfs (root .right );
228
+ };
229
+ dfs (root );
230
+ return ans ;
204
231
}
205
232
```
206
233
@@ -225,69 +252,59 @@ func abs(x int) int {
225
252
// }
226
253
// }
227
254
// }
228
- use std :: cell :: RefCell ;
229
255
use std :: rc :: Rc ;
256
+ use std :: cell :: RefCell ;
230
257
impl Solution {
231
- #[allow(dead_code)]
232
258
pub fn get_minimum_difference (root : Option <Rc <RefCell <TreeNode >>>) -> i32 {
233
- let mut ret = i32 :: MAX ;
234
- let mut prev = i32 :: MAX ;
235
- Self :: traverse (root , & mut prev , & mut ret );
236
- ret
237
- }
238
-
239
- #[allow(dead_code)]
240
- fn traverse (root : Option <Rc <RefCell <TreeNode >>>, prev : & mut i32 , ans : & mut i32 ) {
241
- let left = root . as_ref (). unwrap (). borrow (). left. clone ();
242
- let right = root . as_ref (). unwrap (). borrow (). right. clone ();
243
- let val = root . as_ref (). unwrap (). borrow (). val;
244
- if ! left . is_none () {
245
- Self :: traverse (left . clone (), prev , ans );
246
- }
247
- * ans = std :: cmp :: min (* ans , (* prev - val ). abs ());
248
- * prev = val ;
249
- if ! right . is_none () {
250
- Self :: traverse (right . clone (), prev , ans );
259
+ const inf : i32 = 1 << 30 ;
260
+ let mut ans = inf ;
261
+ let mut pre = - inf ;
262
+
263
+ fn dfs (node : Option <Rc <RefCell <TreeNode >>>, ans : & mut i32 , pre : & mut i32 ) {
264
+ if let Some (n ) = node {
265
+ let n = n . borrow ();
266
+ dfs (n . left. clone (), ans , pre );
267
+ * ans = (* ans ). min (n . val - * pre );
268
+ * pre = n . val;
269
+ dfs (n . right. clone (), ans , pre );
270
+ }
251
271
}
272
+
273
+ dfs (root , & mut ans , & mut pre );
274
+ ans
252
275
}
253
276
}
254
277
```
255
278
256
- #### TypeScript
279
+ #### JavaScript
257
280
258
- ``` ts
281
+ ``` js
259
282
/**
260
283
* Definition for a binary tree node.
261
- * class TreeNode {
262
- * val: number
263
- * left: TreeNode | null
264
- * right: TreeNode | null
265
- * constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
266
- * this.val = (val===undefined ? 0 : val)
267
- * this.left = (left===undefined ? null : left)
268
- * this.right = (right===undefined ? null : right)
269
- * }
284
+ * function TreeNode(val, left, right) {
285
+ * this.val = (val===undefined ? 0 : val)
286
+ * this.left = (left===undefined ? null : left)
287
+ * this.right = (right===undefined ? null : right)
270
288
* }
271
289
*/
272
- function getMinimumDifference(root : TreeNode | null ): number {
273
- if (! root ) return 0 ;
274
-
275
- let prev = Number .MIN_SAFE_INTEGER;
276
- let min = Number .MAX_SAFE_INTEGER;
277
-
278
- const dfs = (node : TreeNode | null ) => {
279
- if (! node ) return ;
280
-
281
- dfs (node .left );
282
- min = Math .min (min , node .val - prev );
283
- prev = node .val ;
284
- dfs (node .right );
290
+ /**
291
+ * @param {TreeNode} root
292
+ * @return {number}
293
+ */
294
+ var getMinimumDifference = function (root ) {
295
+ let [ans, pre] = [Infinity , - Infinity ];
296
+ const dfs = root => {
297
+ if (! root) {
298
+ return ;
299
+ }
300
+ dfs (root .left );
301
+ ans = Math .min (ans, root .val - pre);
302
+ pre = root .val ;
303
+ dfs (root .right );
285
304
};
286
-
287
305
dfs (root);
288
-
289
- return min ;
290
- }
306
+ return ans;
307
+ };
291
308
```
292
309
293
310
<!-- tabs: end -->
0 commit comments