Skip to content

Commit 3a5ed87

Browse files
committed
feat: add solutions to lc problem: No.1602
No.1602.Find Nearest Right Node in Binary Tree
1 parent 7c19f5b commit 3a5ed87

File tree

7 files changed

+586
-113
lines changed

7 files changed

+586
-113
lines changed

solution/1600-1699/1602.Find Nearest Right Node in Binary Tree/README.md

Lines changed: 265 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,17 @@
5959

6060
<!-- 这里可写通用的实现逻辑 -->
6161

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$ 是二叉树的节点个数。
6373

6474
<!-- tabs:start -->
6575

@@ -75,18 +85,45 @@ BFS 层序遍历。
7585
# self.left = left
7686
# self.right = right
7787
class Solution:
78-
def findNearestRightNode(self, root: TreeNode, u: TreeNode) -> TreeNode:
88+
def findNearestRightNode(self, root: TreeNode, u: TreeNode) -> Optional[TreeNode]:
7989
q = deque([root])
8090
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
90127
```
91128

92129
### **Java**
@@ -114,16 +151,16 @@ class Solution {
114151
Deque<TreeNode> q = new ArrayDeque<>();
115152
q.offer(root);
116153
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;
121158
}
122-
if (node.left != null) {
123-
q.offer(node.left);
159+
if (root.left != null) {
160+
q.offer(root.left);
124161
}
125-
if (node.right != null) {
126-
q.offer(node.right);
162+
if (root.right != null) {
163+
q.offer(root.right);
127164
}
128165
}
129166
}
@@ -132,6 +169,51 @@ class Solution {
132169
}
133170
```
134171

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+
135217
### **C++**
136218

137219
```cpp
@@ -149,22 +231,61 @@ class Solution {
149231
class Solution {
150232
public:
151233
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();
157238
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);
161242
}
162243
}
163244
return nullptr;
164245
}
165246
};
166247
```
167248
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+
168289
### **Go**
169290

170291
```go
@@ -179,27 +300,133 @@ public:
179300
func findNearestRightNode(root *TreeNode, u *TreeNode) *TreeNode {
180301
q := []*TreeNode{root}
181302
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]
188309
}
189-
return t[i+1]
310+
return nil
190311
}
191-
if node.Left != nil {
192-
q = append(q, node.Left)
312+
if root.Left != nil {
313+
q = append(q, root.Left)
193314
}
194-
if node.Right != nil {
195-
q = append(q, node.Right)
315+
if root.Right != nil {
316+
q = append(q, root.Right)
196317
}
197318
}
198319
}
199320
return nil
200321
}
201322
```
202323

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+
203430
### **...**
204431

205432
```

0 commit comments

Comments
 (0)