57
57
58
58
## 解法
59
59
60
- ### 方法一
60
+ ### 方法一:DFS + BFS
61
+
62
+ 我们首先使用深度优先搜索构建一个无向图 $g$,其中 $g[ node] $ 表示与节点 $node$ 相邻的节点集合。然后我们从节点 $k$ 开始进行广度优先搜索,直到找到一个叶节点为止,即为答案。
63
+
64
+ 时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树节点个数。
61
65
62
66
<!-- tabs:start -->
63
67
69
73
# self.left = left
70
74
# self.right = right
71
75
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] ):
74
78
if root:
75
- g[root].append(p )
76
- g[p ].append(root)
79
+ g[root].append(fa )
80
+ g[fa ].append(root)
77
81
dfs(root.left, root)
78
82
dfs(root.right, root)
79
83
80
84
g = defaultdict(list )
81
85
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 :
85
89
node = q.popleft()
86
- seen.add(node)
87
90
if node:
88
- if node.left is None and node.right is None :
91
+ if node.left == node.right:
89
92
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)
93
97
```
94
98
95
99
``` java
@@ -109,40 +113,38 @@ class Solution:
109
113
* }
110
114
*/
111
115
class Solution {
112
- private Map<TreeNode , List<TreeNode > > g;
116
+ private Map<TreeNode , List<TreeNode > > g = new HashMap<> () ;
113
117
114
118
public int findClosestLeaf (TreeNode root , int k ) {
115
- g = new HashMap<> ();
116
119
dfs(root, null );
117
120
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);
121
126
break ;
122
127
}
123
128
}
124
- Set<TreeNode > seen = new HashSet<> ();
125
- while (! q. isEmpty()) {
129
+ while (true ) {
126
130
TreeNode node = q. poll();
127
- seen. add(node);
128
131
if (node != null ) {
129
- if (node. left == null && node. right == null ) {
132
+ if (node. left == node. right) {
130
133
return node. val;
131
134
}
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 );
135
138
}
136
139
}
137
140
}
138
141
}
139
- return 0 ;
140
142
}
141
143
142
- private void dfs (TreeNode root , TreeNode p ) {
144
+ private void dfs (TreeNode root , TreeNode fa ) {
143
145
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);
146
148
dfs(root. left, root);
147
149
dfs(root. right, root);
148
150
}
@@ -164,39 +166,41 @@ class Solution {
164
166
*/
165
167
class Solution {
166
168
public:
167
- unordered_map<TreeNode* , vector<TreeNode* >> g;
168
-
169
169
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
+ };
170
179
dfs(root, nullptr);
171
180
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);
176
186
}
177
187
}
178
- unordered_set<TreeNode*> seen;
179
- while (!q.empty()) {
188
+ while (1) {
180
189
auto node = q.front();
181
190
q.pop();
182
- seen.insert(node);
183
191
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);
188
201
}
189
202
}
190
203
}
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);
200
204
}
201
205
};
202
206
```
@@ -211,42 +215,41 @@ public:
211
215
* }
212
216
*/
213
217
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)
219
226
}
220
- g[root] = append (g[root], p)
221
- g[p] = append (g[p], root)
222
- dfs (root.Left , root)
223
- dfs (root.Right , root)
224
227
}
225
228
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
230
235
break
231
236
}
232
237
}
233
- seen := make (map [*TreeNode]bool )
234
- for len (q) > 0 {
238
+ for {
235
239
node := q[0]
236
240
q = q[1:]
237
- seen[node] = true
238
241
if node != nil {
239
- if node.Left == nil && node.Right == nil {
242
+ if node.Left == node.Right {
240
243
return node.Val
241
244
}
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)
245
249
}
246
250
}
247
251
}
248
252
}
249
- return 0
250
253
}
251
254
```
252
255
0 commit comments