Skip to content

Commit ceafbd2

Browse files
committed
feat: add solutions to lc problem: No.1379
No.1379 Find a Corresponding Node of a Binary Tree in a Clone of That Tree
1 parent 112e9c3 commit ceafbd2

File tree

8 files changed

+229
-150
lines changed

8 files changed

+229
-150
lines changed

solution/1300-1399/1377.Frog Position After T Seconds/Solution.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,4 +20,4 @@ def frogPosition(
2020
vis[v] = True
2121
q.append((v, p / cnt))
2222
t -= 1
23-
return 0
23+
return 0

solution/1300-1399/1379.Find a Corresponding Node of a Binary Tree in a Clone of That Tree/README.md

Lines changed: 81 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,12 @@
6969

7070
<!-- 这里可写通用的实现逻辑 -->
7171

72+
**方法一:DFS**
73+
74+
我们设计一个函数 $dfs(root1, root2)$,它会在树 $root1$ 和 $root2$ 中同时进行 DFS 遍历,当遍历到某个节点时,如果这个节点恰好为 $target$,那么我们就返回 $root2$ 中对应的节点。否则,我们递归地在 $root1$ 和 $root2$ 的左右子树中寻找 $target$,并返回找到的结果中不为空的那一个。
75+
76+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是树中节点的数量。
77+
7278
<!-- tabs:start -->
7379

7480
### **Python3**
@@ -88,20 +94,14 @@ class Solution:
8894
def getTargetCopy(
8995
self, original: TreeNode, cloned: TreeNode, target: TreeNode
9096
) -> TreeNode:
91-
res = None
92-
93-
def dfs(original, cloned):
94-
nonlocal res
95-
if cloned is None:
96-
return
97-
if original == target:
98-
res = cloned
99-
return
100-
dfs(original.left, cloned.left)
101-
dfs(original.right, cloned.right)
102-
103-
dfs(original, cloned)
104-
return res
97+
def dfs(root1: TreeNode, root2: TreeNode) -> TreeNode:
98+
if root1 is None:
99+
return None
100+
if root1 == target:
101+
return root2
102+
return dfs(root1.left, root2.left) or dfs(root1.right, root2.right)
103+
104+
return dfs(original, cloned)
105105
```
106106

107107
### **Java**
@@ -120,24 +120,22 @@ class Solution:
120120
*/
121121

122122
class Solution {
123-
private TreeNode res;
123+
private TreeNode target;
124124

125-
public final TreeNode getTargetCopy(
126-
final TreeNode original, final TreeNode cloned, final TreeNode target) {
127-
dfs(original, cloned, target);
128-
return res;
125+
public final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
126+
this.target = target;
127+
return dfs(original, cloned);
129128
}
130129

131-
private void dfs(TreeNode original, TreeNode cloned, TreeNode target) {
132-
if (cloned == null) {
133-
return;
130+
private TreeNode dfs(TreeNode root1, TreeNode root2) {
131+
if (root1 == null) {
132+
return null;
134133
}
135-
if (original == target) {
136-
res = cloned;
137-
return;
134+
if (root1 == target) {
135+
return root2;
138136
}
139-
dfs(original.left, cloned.left, target);
140-
dfs(original.right, cloned.right, target);
137+
TreeNode res = dfs(root1.left, root2.left);
138+
return res == null ? dfs(root1.right, root2.right) : res;
141139
}
142140
}
143141
```
@@ -157,21 +155,18 @@ class Solution {
157155

158156
class Solution {
159157
public:
160-
TreeNode* res;
161-
162158
TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {
163-
dfs(original, cloned, target);
164-
return res;
165-
}
166-
167-
void dfs(TreeNode* original, TreeNode* cloned, TreeNode* target) {
168-
if (!cloned) return;
169-
if (original == target) {
170-
res = cloned;
171-
return;
172-
}
173-
dfs(original->left, cloned->left, target);
174-
dfs(original->right, cloned->right, target);
159+
function<TreeNode*(TreeNode*, TreeNode*)> dfs = [&](TreeNode* root1, TreeNode* root2) -> TreeNode* {
160+
if (root1 == nullptr) {
161+
return nullptr;
162+
}
163+
if (root1 == target) {
164+
return root2;
165+
}
166+
TreeNode* left = dfs(root1->left, root2->left);
167+
return left == nullptr ? dfs(root1->right, root2->right) : left;
168+
};
169+
return dfs(original, cloned);
175170
}
176171
};
177172
```
@@ -198,16 +193,53 @@ function getTargetCopy(
198193
cloned: TreeNode | null,
199194
target: TreeNode | null,
200195
): TreeNode | null {
201-
if (cloned === null) {
202-
return null;
196+
const dfs = (
197+
root1: TreeNode | null,
198+
root2: TreeNode | null,
199+
): TreeNode | null => {
200+
if (!root1) {
201+
return null;
202+
}
203+
if (root1 === target) {
204+
return root2;
205+
}
206+
return dfs(root1.left, root2.left) || dfs(root1.right, root2.right);
207+
};
208+
return dfs(original, cloned);
209+
}
210+
```
211+
212+
### **C#**
213+
214+
```cs
215+
/**
216+
* Definition for a binary tree node.
217+
* public class TreeNode {
218+
* public int val;
219+
* public TreeNode left;
220+
* public TreeNode right;
221+
* public TreeNode(int x) { val = x; }
222+
* }
223+
*/
224+
225+
public class Solution {
226+
private TreeNode target;
227+
228+
public TreeNode GetTargetCopy(TreeNode original, TreeNode cloned, TreeNode target) {
229+
this.target = target;
230+
return dfs(original, cloned);
203231
}
204-
if (cloned.val === target.val) {
205-
return cloned;
232+
233+
private TreeNode dfs(TreeNode original, TreeNode cloned) {
234+
if (original == null) {
235+
return null;
236+
}
237+
if (original == target) {
238+
return cloned;
239+
}
240+
TreeNode left = dfs(original.left, cloned.left);
241+
return left == null ? dfs(original.right, cloned.right) : left;
206242
}
207-
return (
208-
getTargetCopy(original, cloned.left, target) ||
209-
getTargetCopy(original, cloned.right, target)
210-
);
211243
}
212244
```
213245

solution/1300-1399/1379.Find a Corresponding Node of a Binary Tree in a Clone of That Tree/README_EN.md

Lines changed: 76 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -66,20 +66,14 @@ class Solution:
6666
def getTargetCopy(
6767
self, original: TreeNode, cloned: TreeNode, target: TreeNode
6868
) -> TreeNode:
69-
res = None
70-
71-
def dfs(original, cloned):
72-
nonlocal res
73-
if cloned is None:
74-
return
75-
if original == target:
76-
res = cloned
77-
return
78-
dfs(original.left, cloned.left)
79-
dfs(original.right, cloned.right)
80-
81-
dfs(original, cloned)
82-
return res
69+
def dfs(root1: TreeNode, root2: TreeNode) -> TreeNode:
70+
if root1 is None:
71+
return None
72+
if root1 == target:
73+
return root2
74+
return dfs(root1.left, root2.left) or dfs(root1.right, root2.right)
75+
76+
return dfs(original, cloned)
8377
```
8478

8579
### **Java**
@@ -96,26 +90,24 @@ class Solution:
9690
*/
9791

9892
class Solution {
99-
private TreeNode res;
93+
private TreeNode target;
10094

101-
public final TreeNode getTargetCopy(
102-
final TreeNode original, final TreeNode cloned, final TreeNode target) {
103-
dfs(original, cloned, target);
104-
return res;
95+
public final TreeNode getTargetCopy(final TreeNode original, final TreeNode cloned, final TreeNode target) {
96+
this.target = target;
97+
return dfs(original, cloned);
10598
}
10699

107-
private void dfs(TreeNode original, TreeNode cloned, TreeNode target) {
108-
if (cloned == null) {
109-
return;
100+
private TreeNode dfs(TreeNode root1, TreeNode root2) {
101+
if (root1 == null) {
102+
return null;
110103
}
111-
if (original == target) {
112-
res = cloned;
113-
return;
104+
if (root1 == target) {
105+
return root2;
114106
}
115-
dfs(original.left, cloned.left, target);
116-
dfs(original.right, cloned.right, target);
107+
TreeNode res = dfs(root1.left, root2.left);
108+
return res == null ? dfs(root1.right, root2.right) : res;
117109
}
118-
}
110+
119111
```
120112

121113
### **C++**
@@ -133,21 +125,18 @@ class Solution {
133125

134126
class Solution {
135127
public:
136-
TreeNode* res;
137-
138128
TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {
139-
dfs(original, cloned, target);
140-
return res;
141-
}
142-
143-
void dfs(TreeNode* original, TreeNode* cloned, TreeNode* target) {
144-
if (!cloned) return;
145-
if (original == target) {
146-
res = cloned;
147-
return;
148-
}
149-
dfs(original->left, cloned->left, target);
150-
dfs(original->right, cloned->right, target);
129+
function<TreeNode*(TreeNode*, TreeNode*)> dfs = [&](TreeNode* root1, TreeNode* root2) -> TreeNode* {
130+
if (root1 == nullptr) {
131+
return nullptr;
132+
}
133+
if (root1 == target) {
134+
return root2;
135+
}
136+
TreeNode* left = dfs(root1->left, root2->left);
137+
return left == nullptr ? dfs(root1->right, root2->right) : left;
138+
};
139+
return dfs(original, cloned);
151140
}
152141
};
153142
```
@@ -174,16 +163,53 @@ function getTargetCopy(
174163
cloned: TreeNode | null,
175164
target: TreeNode | null,
176165
): TreeNode | null {
177-
if (cloned === null) {
178-
return null;
166+
const dfs = (
167+
root1: TreeNode | null,
168+
root2: TreeNode | null,
169+
): TreeNode | null => {
170+
if (!root1) {
171+
return null;
172+
}
173+
if (root1 === target) {
174+
return root2;
175+
}
176+
return dfs(root1.left, root2.left) || dfs(root1.right, root2.right);
177+
};
178+
return dfs(original, cloned);
179+
}
180+
```
181+
182+
### **C#**
183+
184+
```cs
185+
/**
186+
* Definition for a binary tree node.
187+
* public class TreeNode {
188+
* public int val;
189+
* public TreeNode left;
190+
* public TreeNode right;
191+
* public TreeNode(int x) { val = x; }
192+
* }
193+
*/
194+
195+
public class Solution {
196+
private TreeNode target;
197+
198+
public TreeNode GetTargetCopy(TreeNode original, TreeNode cloned, TreeNode target) {
199+
this.target = target;
200+
return dfs(original, cloned);
179201
}
180-
if (cloned.val === target.val) {
181-
return cloned;
202+
203+
private TreeNode dfs(TreeNode original, TreeNode cloned) {
204+
if (original == null) {
205+
return null;
206+
}
207+
if (original == target) {
208+
return cloned;
209+
}
210+
TreeNode left = dfs(original.left, cloned.left);
211+
return left == null ? dfs(original.right, cloned.right) : left;
182212
}
183-
return (
184-
getTargetCopy(original, cloned.left, target) ||
185-
getTargetCopy(original, cloned.right, target)
186-
);
187213
}
188214
```
189215

solution/1300-1399/1379.Find a Corresponding Node of a Binary Tree in a Clone of That Tree/Solution.cpp

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,20 +10,17 @@
1010

1111
class Solution {
1212
public:
13-
TreeNode* res;
14-
1513
TreeNode* getTargetCopy(TreeNode* original, TreeNode* cloned, TreeNode* target) {
16-
dfs(original, cloned, target);
17-
return res;
18-
}
19-
20-
void dfs(TreeNode* original, TreeNode* cloned, TreeNode* target) {
21-
if (!cloned) return;
22-
if (original == target) {
23-
res = cloned;
24-
return;
25-
}
26-
dfs(original->left, cloned->left, target);
27-
dfs(original->right, cloned->right, target);
14+
function<TreeNode*(TreeNode*, TreeNode*)> dfs = [&](TreeNode* root1, TreeNode* root2) -> TreeNode* {
15+
if (root1 == nullptr) {
16+
return nullptr;
17+
}
18+
if (root1 == target) {
19+
return root2;
20+
}
21+
TreeNode* left = dfs(root1->left, root2->left);
22+
return left == nullptr ? dfs(root1->right, root2->right) : left;
23+
};
24+
return dfs(original, cloned);
2825
}
2926
};

0 commit comments

Comments
 (0)