38
38
39
39
<!-- 这里可写通用的实现逻辑 -->
40
40
41
- 二分查找。
41
+ ** 方法一:中序遍历**
42
+
43
+ 我们用一个变量 $mi$ 维护最小的差值,用一个变量 $ans$ 维护答案。初始时 $mi=\infty$, $ans=root.val$。
44
+
45
+ 接下来,进行中序遍历,每次计算当前节点与目标值 $target$ 的差的绝对值 $t$。如果 $t \lt mi$,或者 $t = mi$ 且当前节点的值小于 $ans$,则更新 $mi$ 和 $ans$。
46
+
47
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉搜索树的节点数。
48
+
49
+ ** 方法二:二分查找**
50
+
51
+ 与方法一类似,我们用一个变量 $mi$ 维护最小的差值,用一个变量 $ans$ 维护答案。初始时 $mi=\infty$, $ans=root.val$。
52
+
53
+ 接下来,进行二分查找,每次计算当前节点与目标值 $target$ 的差的绝对值 $t$。如果 $t \lt mi$,或者 $t = mi$ 且当前节点的值小于 $ans$,则更新 $mi$ 和 $ans$。如果当前节点的值大于 $target$,则查找左子树,否则查找右子树。当我们遍历到叶子节点时,就可以结束二分查找了。
54
+
55
+ 时间复杂度 $O(n)$,空间复杂度 $O(1)$。其中 $n$ 是二叉搜索树的节点数。
42
56
43
57
<!-- tabs:start -->
44
58
45
59
### ** Python3**
46
60
47
61
<!-- 这里可写当前语言的特殊实现逻辑 -->
48
62
63
+ ``` python
64
+ # Definition for a binary tree node.
65
+ # class TreeNode:
66
+ # def __init__(self, val=0, left=None, right=None):
67
+ # self.val = val
68
+ # self.left = left
69
+ # self.right = right
70
+ class Solution :
71
+ def closestValue (self , root : Optional[TreeNode], target : float ) -> int :
72
+ def dfs (root ):
73
+ if root is None :
74
+ return
75
+ dfs(root.left)
76
+ nonlocal ans, mi
77
+ t = abs (root.val - target)
78
+ if t < mi:
79
+ mi = t
80
+ ans = root.val
81
+ dfs(root.right)
82
+
83
+ ans, mi = root.val, inf
84
+ dfs(root)
85
+ return ans
86
+ ```
87
+
49
88
``` python
50
89
# Definition for a binary tree node.
51
90
# class TreeNode:
@@ -58,7 +97,7 @@ class Solution:
58
97
ans, mi = root.val, inf
59
98
while root:
60
99
t = abs (root.val - target)
61
- if t < mi:
100
+ if t < mi or (t == mi and root.val < ans) :
62
101
mi = t
63
102
ans = root.val
64
103
if root.val > target:
@@ -72,6 +111,48 @@ class Solution:
72
111
73
112
<!-- 这里可写当前语言的特殊实现逻辑 -->
74
113
114
+ ``` java
115
+ /**
116
+ * Definition for a binary tree node.
117
+ * public class TreeNode {
118
+ * int val;
119
+ * TreeNode left;
120
+ * TreeNode right;
121
+ * TreeNode() {}
122
+ * TreeNode(int val) { this.val = val; }
123
+ * TreeNode(int val, TreeNode left, TreeNode right) {
124
+ * this.val = val;
125
+ * this.left = left;
126
+ * this.right = right;
127
+ * }
128
+ * }
129
+ */
130
+ class Solution {
131
+ private int ans;
132
+ private double target;
133
+ private double mi = Double . MAX_VALUE ;
134
+
135
+ public int closestValue (TreeNode root , double target ) {
136
+ this . target = target;
137
+ dfs(root);
138
+ return ans;
139
+ }
140
+
141
+ private void dfs (TreeNode root ) {
142
+ if (root == null ) {
143
+ return ;
144
+ }
145
+ dfs(root. left);
146
+ double t = Math . abs(root. val - target);
147
+ if (t < mi) {
148
+ mi = t;
149
+ ans = root. val;
150
+ }
151
+ dfs(root. right);
152
+ }
153
+ }
154
+ ```
155
+
75
156
``` java
76
157
/**
77
158
* Definition for a binary tree node.
@@ -94,7 +175,7 @@ class Solution {
94
175
double mi = Double . MAX_VALUE ;
95
176
while (root != null ) {
96
177
double t = Math . abs(root. val - target);
97
- if (t < mi) {
178
+ if (t < mi || (t == mi && root . val < ans) ) {
98
179
mi = t;
99
180
ans = root. val;
100
181
}
@@ -109,43 +190,43 @@ class Solution {
109
190
}
110
191
```
111
192
112
- ### ** JavaScript **
193
+ ### ** C++ **
113
194
114
- ``` js
195
+ ``` cpp
115
196
/* *
116
197
* Definition for a binary tree node.
117
- * function TreeNode(val, left, right) {
118
- * this.val = (val===undefined ? 0 : val)
119
- * this.left = (left===undefined ? null : left)
120
- * this.right = (right===undefined ? null : right)
121
- * }
122
- */
123
- /**
124
- * @param {TreeNode} root
125
- * @param {number} target
126
- * @return {number}
198
+ * struct TreeNode {
199
+ * int val;
200
+ * TreeNode *left;
201
+ * TreeNode *right;
202
+ * TreeNode() : val(0), left(nullptr), right(nullptr) {}
203
+ * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
204
+ * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
205
+ * };
127
206
*/
128
- var closestValue = function (root , target ) {
129
- let ans = root .val ;
130
- let mi = Number .MAX_VALUE ;
131
- while (root) {
132
- const t = Math .abs (root .val - target);
133
- if (t < mi) {
134
- mi = t;
135
- ans = root .val ;
136
- }
137
- if (root .val > target) {
138
- root = root .left ;
139
- } else {
140
- root = root .right ;
141
- }
207
+ class Solution {
208
+ public:
209
+ int closestValue(TreeNode* root, double target) {
210
+ int ans = root->val;
211
+ double mi = INT_MAX;
212
+ function<void(TreeNode* )> dfs = [ &] (TreeNode* root) {
213
+ if (!root) {
214
+ return;
215
+ }
216
+ dfs(root->left);
217
+ double t = abs(root->val - target);
218
+ if (t < mi) {
219
+ mi = t;
220
+ ans = root->val;
221
+ }
222
+ dfs(root->right);
223
+ };
224
+ dfs(root);
225
+ return ans;
142
226
}
143
- return ans;
144
227
};
145
228
```
146
229
147
- ### ** C++**
148
-
149
230
```cpp
150
231
/**
151
232
* Definition for a binary tree node.
@@ -165,14 +246,15 @@ public:
165
246
double mi = INT_MAX;
166
247
while (root) {
167
248
double t = abs(root->val - target);
168
- if (t < mi) {
249
+ if (t < mi || (t == mi && root->val < ans) ) {
169
250
mi = t;
170
251
ans = root->val;
171
252
}
172
- if (root->val > target)
253
+ if (root->val > target) {
173
254
root = root->left;
174
- else
255
+ } else {
175
256
root = root->right;
257
+ }
176
258
}
177
259
return ans;
178
260
}
@@ -193,12 +275,42 @@ public:
193
275
func closestValue (root *TreeNode , target float64 ) int {
194
276
ans := root.Val
195
277
mi := math.MaxFloat64
196
- for root != nil {
278
+ var dfs func (*TreeNode)
279
+ dfs = func (root *TreeNode) {
280
+ if root == nil {
281
+ return
282
+ }
283
+ dfs (root.Left )
197
284
t := math.Abs (float64 (root.Val ) - target)
198
285
if t < mi {
199
286
mi = t
200
287
ans = root.Val
201
288
}
289
+ dfs (root.Right )
290
+ }
291
+ dfs (root)
292
+ return ans
293
+ }
294
+ ```
295
+
296
+ ``` go
297
+ /* *
298
+ * Definition for a binary tree node.
299
+ * type TreeNode struct {
300
+ * Val int
301
+ * Left *TreeNode
302
+ * Right *TreeNode
303
+ * }
304
+ */
305
+ func closestValue (root *TreeNode , target float64 ) int {
306
+ ans := root.Val
307
+ mi := math.MaxFloat64
308
+ for root != nil {
309
+ t := math.Abs (float64 (root.Val ) - target)
310
+ if t < mi || (t == mi && root.Val < ans) {
311
+ mi = t
312
+ ans = root.Val
313
+ }
202
314
if float64 (root.Val ) > target {
203
315
root = root.Left
204
316
} else {
@@ -209,6 +321,75 @@ func closestValue(root *TreeNode, target float64) int {
209
321
}
210
322
```
211
323
324
+ ### ** JavaScript**
325
+
326
+ ``` js
327
+ /**
328
+ * Definition for a binary tree node.
329
+ * function TreeNode(val, left, right) {
330
+ * this.val = (val===undefined ? 0 : val)
331
+ * this.left = (left===undefined ? null : left)
332
+ * this.right = (right===undefined ? null : right)
333
+ * }
334
+ */
335
+ /**
336
+ * @param {TreeNode} root
337
+ * @param {number} target
338
+ * @return {number}
339
+ */
340
+ var closestValue = function (root , target ) {
341
+ let mi = Infinity ;
342
+ let ans = root .val ;
343
+ const dfs = root => {
344
+ if (! root) {
345
+ return ;
346
+ }
347
+ dfs (root .left );
348
+ const t = Math .abs (root .val - target);
349
+ if (t < mi) {
350
+ mi = t;
351
+ ans = root .val ;
352
+ }
353
+ dfs (root .right );
354
+ };
355
+ dfs (root);
356
+ return ans;
357
+ };
358
+ ```
359
+
360
+ ``` js
361
+ /**
362
+ * Definition for a binary tree node.
363
+ * function TreeNode(val, left, right) {
364
+ * this.val = (val===undefined ? 0 : val)
365
+ * this.left = (left===undefined ? null : left)
366
+ * this.right = (right===undefined ? null : right)
367
+ * }
368
+ */
369
+ /**
370
+ * @param {TreeNode} root
371
+ * @param {number} target
372
+ * @return {number}
373
+ */
374
+ var closestValue = function (root , target ) {
375
+ let ans = root .val ;
376
+ let mi = Number .MAX_VALUE ;
377
+ while (root) {
378
+ const t = Math .abs (root .val - target);
379
+ if (t < mi || (t === mi && root .val < ans)) {
380
+ mi = t;
381
+ ans = root .val ;
382
+ }
383
+ if (root .val > target) {
384
+ root = root .left ;
385
+ } else {
386
+ root = root .right ;
387
+ }
388
+ }
389
+ return ans;
390
+ };
391
+ ```
392
+
212
393
### ** ...**
213
394
214
395
```
0 commit comments