Skip to content

Commit dbec400

Browse files
authored
feat: add solutions to lc problem: No.0742 (doocs#2724)
No.0742.Closest Leaf in a Binary Tree
1 parent 6fe2fcf commit dbec400

File tree

6 files changed

+220
-215
lines changed

6 files changed

+220
-215
lines changed

solution/0700-0799/0742.Closest Leaf in a Binary Tree/README.md

Lines changed: 75 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,11 @@
5757

5858
## 解法
5959

60-
### 方法一
60+
### 方法一:DFS + BFS
61+
62+
我们首先使用深度优先搜索构建一个无向图 $g$,其中 $g[node]$ 表示与节点 $node$ 相邻的节点集合。然后我们从节点 $k$ 开始进行广度优先搜索,直到找到一个叶节点为止,即为答案。
63+
64+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树节点个数。
6165

6266
<!-- tabs:start -->
6367

@@ -69,27 +73,27 @@
6973
# self.left = left
7074
# self.right = right
7175
class Solution:
72-
def findClosestLeaf(self, root: TreeNode, k: int) -> int:
73-
def dfs(root, p):
76+
def findClosestLeaf(self, root: Optional[TreeNode], k: int) -> int:
77+
def dfs(root: Optional[TreeNode], fa: Optional[TreeNode]):
7478
if root:
75-
g[root].append(p)
76-
g[p].append(root)
79+
g[root].append(fa)
80+
g[fa].append(root)
7781
dfs(root.left, root)
7882
dfs(root.right, root)
7983

8084
g = defaultdict(list)
8185
dfs(root, None)
82-
q = deque([node for node in g if node and node.val == k])
83-
seen = set()
84-
while q:
86+
q = deque(node for node in g if node and node.val == k)
87+
vis = set(q)
88+
while 1:
8589
node = q.popleft()
86-
seen.add(node)
8790
if node:
88-
if node.left is None and node.right is None:
91+
if node.left == node.right:
8992
return node.val
90-
for next in g[node]:
91-
if next not in seen:
92-
q.append(next)
93+
for nxt in g[node]:
94+
if nxt not in vis:
95+
vis.add(nxt)
96+
q.append(nxt)
9397
```
9498

9599
```java
@@ -109,40 +113,38 @@ class Solution:
109113
* }
110114
*/
111115
class Solution {
112-
private Map<TreeNode, List<TreeNode>> g;
116+
private Map<TreeNode, List<TreeNode>> g = new HashMap<>();
113117

114118
public int findClosestLeaf(TreeNode root, int k) {
115-
g = new HashMap<>();
116119
dfs(root, null);
117120
Deque<TreeNode> q = new LinkedList<>();
118-
for (Map.Entry<TreeNode, List<TreeNode>> entry : g.entrySet()) {
119-
if (entry.getKey() != null && entry.getKey().val == k) {
120-
q.offer(entry.getKey());
121+
Set<TreeNode> vis = new HashSet<>(q.size());
122+
for (TreeNode node : g.keySet()) {
123+
if (node != null && node.val == k) {
124+
vis.add(node);
125+
q.offer(node);
121126
break;
122127
}
123128
}
124-
Set<TreeNode> seen = new HashSet<>();
125-
while (!q.isEmpty()) {
129+
while (true) {
126130
TreeNode node = q.poll();
127-
seen.add(node);
128131
if (node != null) {
129-
if (node.left == null && node.right == null) {
132+
if (node.left == node.right) {
130133
return node.val;
131134
}
132-
for (TreeNode next : g.get(node)) {
133-
if (!seen.contains(next)) {
134-
q.offer(next);
135+
for (TreeNode nxt : g.get(node)) {
136+
if (vis.add(nxt)) {
137+
q.offer(nxt);
135138
}
136139
}
137140
}
138141
}
139-
return 0;
140142
}
141143

142-
private void dfs(TreeNode root, TreeNode p) {
144+
private void dfs(TreeNode root, TreeNode fa) {
143145
if (root != null) {
144-
g.computeIfAbsent(root, k -> new ArrayList<>()).add(p);
145-
g.computeIfAbsent(p, k -> new ArrayList<>()).add(root);
146+
g.computeIfAbsent(root, k -> new ArrayList<>()).add(fa);
147+
g.computeIfAbsent(fa, k -> new ArrayList<>()).add(root);
146148
dfs(root.left, root);
147149
dfs(root.right, root);
148150
}
@@ -164,39 +166,41 @@ class Solution {
164166
*/
165167
class Solution {
166168
public:
167-
unordered_map<TreeNode*, vector<TreeNode*>> g;
168-
169169
int findClosestLeaf(TreeNode* root, int k) {
170+
unordered_map<TreeNode*, vector<TreeNode*>> g;
171+
function<void(TreeNode*, TreeNode*)> dfs = [&](TreeNode* root, TreeNode* fa) {
172+
if (root) {
173+
g[root].push_back(fa);
174+
g[fa].push_back(root);
175+
dfs(root->left, root);
176+
dfs(root->right, root);
177+
}
178+
};
170179
dfs(root, nullptr);
171180
queue<TreeNode*> q;
172-
for (auto& e : g) {
173-
if (e.first && e.first->val == k) {
174-
q.push(e.first);
175-
break;
181+
unordered_set<TreeNode*> vis;
182+
for (auto& [node, _] : g) {
183+
if (node && node->val == k) {
184+
q.push(node);
185+
vis.insert(node);
176186
}
177187
}
178-
unordered_set<TreeNode*> seen;
179-
while (!q.empty()) {
188+
while (1) {
180189
auto node = q.front();
181190
q.pop();
182-
seen.insert(node);
183191
if (node) {
184-
if (!node->left && !node->right) return node->val;
185-
for (auto next : g[node]) {
186-
if (!seen.count(next))
187-
q.push(next);
192+
if (node->left == node->right) {
193+
return node->val;
194+
}
195+
for (auto& nxt : g[node]) {
196+
if (vis.count(nxt)) {
197+
continue;
198+
}
199+
q.push(nxt);
200+
vis.insert(nxt);
188201
}
189202
}
190203
}
191-
return 0;
192-
}
193-
194-
void dfs(TreeNode* root, TreeNode* p) {
195-
if (!root) return;
196-
g[root].push_back(p);
197-
g[p].push_back(root);
198-
dfs(root->left, root);
199-
dfs(root->right, root);
200204
}
201205
};
202206
```
@@ -211,42 +215,41 @@ public:
211215
* }
212216
*/
213217
func findClosestLeaf(root *TreeNode, k int) int {
214-
g := make(map[*TreeNode][]*TreeNode)
215-
var dfs func(root, p *TreeNode)
216-
dfs = func(root, p *TreeNode) {
217-
if root == nil {
218-
return
218+
g := map[*TreeNode][]*TreeNode{}
219+
var dfs func(*TreeNode, *TreeNode)
220+
dfs = func(root, fa *TreeNode) {
221+
if root != nil {
222+
g[root] = append(g[root], fa)
223+
g[fa] = append(g[fa], root)
224+
dfs(root.Left, root)
225+
dfs(root.Right, root)
219226
}
220-
g[root] = append(g[root], p)
221-
g[p] = append(g[p], root)
222-
dfs(root.Left, root)
223-
dfs(root.Right, root)
224227
}
225228
dfs(root, nil)
226-
var q []*TreeNode
227-
for t, _ := range g {
228-
if t != nil && t.Val == k {
229-
q = append(q, t)
229+
q := []*TreeNode{}
230+
vis := map[*TreeNode]bool{}
231+
for node := range g {
232+
if node != nil && node.Val == k {
233+
q = append(q, node)
234+
vis[node] = true
230235
break
231236
}
232237
}
233-
seen := make(map[*TreeNode]bool)
234-
for len(q) > 0 {
238+
for {
235239
node := q[0]
236240
q = q[1:]
237-
seen[node] = true
238241
if node != nil {
239-
if node.Left == nil && node.Right == nil {
242+
if node.Left == node.Right {
240243
return node.Val
241244
}
242-
for _, next := range g[node] {
243-
if !seen[next] {
244-
q = append(q, next)
245+
for _, nxt := range g[node] {
246+
if !vis[nxt] {
247+
vis[nxt] = true
248+
q = append(q, nxt)
245249
}
246250
}
247251
}
248252
}
249-
return 0
250253
}
251254
```
252255

0 commit comments

Comments
 (0)