59
59
60
60
<!-- 这里可写通用的实现逻辑 -->
61
61
62
- BFS 层序遍历。
62
+ ** 方法一:BFS**
63
+
64
+ BFS 层序遍历,找到 $u$ 所在层的右侧相邻节点。
65
+
66
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点个数。
67
+
68
+ ** 方法二:DFS**
69
+
70
+ DFS 先序遍历二叉树,首次搜索到 $u$ 时,标记目前层数 $d$,下次遇到同一层的节点时,即为目标节点。
71
+
72
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的节点个数。
63
73
64
74
<!-- tabs:start -->
65
75
@@ -75,18 +85,45 @@ BFS 层序遍历。
75
85
# self.left = left
76
86
# self.right = right
77
87
class Solution :
78
- def findNearestRightNode (self , root : TreeNode, u : TreeNode) -> TreeNode:
88
+ def findNearestRightNode (self , root : TreeNode, u : TreeNode) -> Optional[ TreeNode] :
79
89
q = deque([root])
80
90
while q:
81
- n = len (q)
82
- for i in range (n):
83
- node = q.popleft()
84
- if node == u:
85
- return None if i == n - 1 else q.popleft()
86
- if node.left:
87
- q.append(node.left)
88
- if node.right:
89
- q.append(node.right)
91
+ for i in range (len (q) - 1 , - 1 , - 1 ):
92
+ root = q.popleft()
93
+ if root == u:
94
+ return q[0 ] if i else None
95
+ if root.left:
96
+ q.append(root.left)
97
+ if root.right:
98
+ q.append(root.right)
99
+ ```
100
+
101
+ ``` python
102
+ # Definition for a binary tree node.
103
+ # class TreeNode:
104
+ # def __init__(self, val=0, left=None, right=None):
105
+ # self.val = val
106
+ # self.left = left
107
+ # self.right = right
108
+ class Solution :
109
+ def findNearestRightNode (self , root : TreeNode, u : TreeNode) -> Optional[TreeNode]:
110
+ def dfs (root , i ):
111
+ nonlocal d, ans
112
+ if root is None or ans:
113
+ return
114
+ if d == i:
115
+ ans = root
116
+ return
117
+ if root == u:
118
+ d = i
119
+ return
120
+ dfs(root.left, i + 1 )
121
+ dfs(root.right, i + 1 )
122
+
123
+ d = 0
124
+ ans = None
125
+ dfs(root, 1 )
126
+ return ans
90
127
```
91
128
92
129
### ** Java**
@@ -114,16 +151,16 @@ class Solution {
114
151
Deque<TreeNode > q = new ArrayDeque<> ();
115
152
q. offer(root);
116
153
while (! q. isEmpty()) {
117
- for (int i = 0 , n = q. size(); i < n; ++ i) {
118
- TreeNode node = q. poll ();
119
- if (node == u) {
120
- return i == n - 1 ? null : q . poll() ;
154
+ for (int i = q. size(); i > 0 ; -- i) {
155
+ root = q. pollFirst ();
156
+ if (root == u) {
157
+ return i > 1 ? q . peekFirst() : null ;
121
158
}
122
- if (node . left != null ) {
123
- q. offer(node . left);
159
+ if (root . left != null ) {
160
+ q. offer(root . left);
124
161
}
125
- if (node . right != null ) {
126
- q. offer(node . right);
162
+ if (root . right != null ) {
163
+ q. offer(root . right);
127
164
}
128
165
}
129
166
}
@@ -132,6 +169,51 @@ class Solution {
132
169
}
133
170
```
134
171
172
+ ``` java
173
+ /**
174
+ * Definition for a binary tree node.
175
+ * public class TreeNode {
176
+ * int val;
177
+ * TreeNode left;
178
+ * TreeNode right;
179
+ * TreeNode() {}
180
+ * TreeNode(int val) { this.val = val; }
181
+ * TreeNode(int val, TreeNode left, TreeNode right) {
182
+ * this.val = val;
183
+ * this.left = left;
184
+ * this.right = right;
185
+ * }
186
+ * }
187
+ */
188
+ class Solution {
189
+ private TreeNode u;
190
+ private TreeNode ans;
191
+ private int d;
192
+
193
+ public TreeNode findNearestRightNode (TreeNode root , TreeNode u ) {
194
+ this . u = u;
195
+ dfs(root, 1 );
196
+ return ans;
197
+ }
198
+
199
+ private void dfs (TreeNode root , int i ) {
200
+ if (root == null || ans != null ) {
201
+ return ;
202
+ }
203
+ if (d == i) {
204
+ ans = root;
205
+ return ;
206
+ }
207
+ if (root == u) {
208
+ d = i;
209
+ return ;
210
+ }
211
+ dfs(root. left, i + 1 );
212
+ dfs(root. right, i + 1 );
213
+ }
214
+ }
215
+ ```
216
+
135
217
### ** C++**
136
218
137
219
``` cpp
@@ -149,22 +231,61 @@ class Solution {
149
231
class Solution {
150
232
public:
151
233
TreeNode* findNearestRightNode(TreeNode* root, TreeNode* u) {
152
- queue<TreeNode* > q;
153
- q.push(root);
154
- while (!q.empty()) {
155
- for (int i = 0, n = q.size(); i < n; ++i) {
156
- TreeNode* node = q.front();
234
+ queue<TreeNode* > q{{root}};
235
+ while (q.size()) {
236
+ for (int i = q.size(); i; --i) {
237
+ root = q.front();
157
238
q.pop();
158
- if (node == u) return i == n - 1 ? nullptr : q.front();
159
- if (node ->left) q.push(node ->left);
160
- if (node ->right) q.push(node ->right);
239
+ if (root == u) return i > 1 ? q.front() : nullptr ;
240
+ if (root ->left) q.push(root ->left);
241
+ if (root ->right) q.push(root ->right);
161
242
}
162
243
}
163
244
return nullptr;
164
245
}
165
246
};
166
247
```
167
248
249
+ ```cpp
250
+ /**
251
+ * Definition for a binary tree node.
252
+ * struct TreeNode {
253
+ * int val;
254
+ * TreeNode *left;
255
+ * TreeNode *right;
256
+ * TreeNode() : val(0), left(nullptr), right(nullptr) {}
257
+ * TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
258
+ * TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
259
+ * };
260
+ */
261
+ class Solution {
262
+ public:
263
+ TreeNode* u;
264
+ TreeNode* ans;
265
+ int d = 0;
266
+
267
+ TreeNode* findNearestRightNode(TreeNode* root, TreeNode* u) {
268
+ this->u = u;
269
+ dfs(root, 1);
270
+ return ans;
271
+ }
272
+
273
+ void dfs(TreeNode* root, int i) {
274
+ if (!root || ans) return;
275
+ if (d == i) {
276
+ ans = root;
277
+ return;
278
+ }
279
+ if (root == u) {
280
+ d = i;
281
+ return;
282
+ }
283
+ dfs(root->left, i + 1);
284
+ dfs(root->right, i + 1);
285
+ }
286
+ };
287
+ ```
288
+
168
289
### ** Go**
169
290
170
291
``` go
@@ -179,27 +300,133 @@ public:
179
300
func findNearestRightNode (root *TreeNode , u *TreeNode ) *TreeNode {
180
301
q := []*TreeNode{root}
181
302
for len (q) > 0 {
182
- t := q
183
- q = nil
184
- for i, node := range t {
185
- if node == u {
186
- if i == len(t)- 1 {
187
- return nil
303
+ for i := len (q); i > 0 ; i-- {
304
+ root = q[ 0 ]
305
+ q = q[ 1 :]
306
+ if root == u {
307
+ if i > 1 {
308
+ return q[ 0 ]
188
309
}
189
- return t[i+1]
310
+ return nil
190
311
}
191
- if node .Left != nil {
192
- q = append(q, node .Left)
312
+ if root .Left != nil {
313
+ q = append (q, root .Left )
193
314
}
194
- if node .Right != nil {
195
- q = append(q, node .Right)
315
+ if root .Right != nil {
316
+ q = append (q, root .Right )
196
317
}
197
318
}
198
319
}
199
320
return nil
200
321
}
201
322
```
202
323
324
+ ``` go
325
+ /* *
326
+ * Definition for a binary tree node.
327
+ * type TreeNode struct {
328
+ * Val int
329
+ * Left *TreeNode
330
+ * Right *TreeNode
331
+ * }
332
+ */
333
+ func findNearestRightNode (root *TreeNode , u *TreeNode ) *TreeNode {
334
+ d := 0
335
+ var ans *TreeNode
336
+ var dfs func (*TreeNode, int )
337
+ dfs = func (root *TreeNode, i int ) {
338
+ if root == nil || ans != nil {
339
+ return
340
+ }
341
+ if d == i {
342
+ ans = root
343
+ return
344
+ }
345
+ if root == u {
346
+ d = i
347
+ return
348
+ }
349
+ dfs (root.Left , i+1 )
350
+ dfs (root.Right , i+1 )
351
+ }
352
+ dfs (root, 1 )
353
+ return ans
354
+ }
355
+ ```
356
+
357
+ ### ** JavaScript**
358
+
359
+ ``` js
360
+ /**
361
+ * Definition for a binary tree node.
362
+ * function TreeNode(val, left, right) {
363
+ * this.val = (val===undefined ? 0 : val)
364
+ * this.left = (left===undefined ? null : left)
365
+ * this.right = (right===undefined ? null : right)
366
+ * }
367
+ */
368
+ /**
369
+ * @param {TreeNode} root
370
+ * @param {TreeNode} u
371
+ * @return {TreeNode}
372
+ */
373
+ var findNearestRightNode = function (root , u ) {
374
+ const q = [root];
375
+ while (q .length ) {
376
+ for (let i = q .length ; i; -- i) {
377
+ root = q .shift ();
378
+ if (root == u) {
379
+ return i > 1 ? q[0 ] : null ;
380
+ }
381
+ if (root .left ) {
382
+ q .push (root .left );
383
+ }
384
+ if (root .right ) {
385
+ q .push (root .right );
386
+ }
387
+ }
388
+ }
389
+ return null ;
390
+ };
391
+ ```
392
+
393
+ ``` js
394
+ /**
395
+ * Definition for a binary tree node.
396
+ * function TreeNode(val, left, right) {
397
+ * this.val = (val===undefined ? 0 : val)
398
+ * this.left = (left===undefined ? null : left)
399
+ * this.right = (right===undefined ? null : right)
400
+ * }
401
+ */
402
+ /**
403
+ * @param {TreeNode} root
404
+ * @param {TreeNode} u
405
+ * @return {TreeNode}
406
+ */
407
+ var findNearestRightNode = function (root , u ) {
408
+ let d = 0 ;
409
+ let ans = null ;
410
+ function dfs (root , i ) {
411
+ if (! root || ans) {
412
+ return ;
413
+ }
414
+ if (d == i) {
415
+ ans = root;
416
+ return ;
417
+ }
418
+ if (root == u) {
419
+ d = i;
420
+ return ;
421
+ }
422
+ dfs (root .left , i + 1 );
423
+ dfs (root .right , i + 1 );
424
+ }
425
+ dfs (root, 1 );
426
+ return ans;
427
+ };
428
+ ```
429
+
203
430
### ** ...**
204
431
205
432
```
0 commit comments