Skip to content

Commit 4037c67

Browse files
authored
feat: add solutions to lc problem: No.0863 (#4079)
No.0863.All Nodes Distance K in Binary Tree
1 parent 5bb1fa9 commit 4037c67

File tree

8 files changed

+307
-479
lines changed

8 files changed

+307
-479
lines changed

solution/0800-0899/0863.All Nodes Distance K in Binary Tree/README.md

+102-165
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,11 @@ tags:
6868

6969
### 方法一:DFS + 哈希表
7070

71-
我们先用 DFS 遍历整棵树,记录每个结点的父结点,然后从目标结点开始,向上、向下分别搜索距离为 $k$ 的结点,添加到答案数组中
71+
我们先用 DFS 遍历整棵树,将每个节点的父节点保存到哈希表 $\textit{g}$ 中
7272

73-
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 是二叉树的结点数。
73+
接下来,我们再次用 DFS,从 $\textit{target}$ 出发,向上向下搜索距离为 $k$ 的节点,添加到结果数组中。
74+
75+
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉树的节点个数。
7476

7577
<!-- tabs:start -->
7678

@@ -87,31 +89,27 @@ tags:
8789

8890
class Solution:
8991
def distanceK(self, root: TreeNode, target: TreeNode, k: int) -> List[int]:
90-
def parents(root, prev):
91-
nonlocal p
92+
def dfs(root, fa):
9293
if root is None:
9394
return
94-
p[root] = prev
95-
parents(root.left, root)
96-
parents(root.right, root)
95+
g[root] = fa
96+
dfs(root.left, root)
97+
dfs(root.right, root)
9798

98-
def dfs(root, k):
99-
nonlocal ans, vis
100-
if root is None or root.val in vis:
99+
def dfs2(root, fa, k):
100+
if root is None:
101101
return
102-
vis.add(root.val)
103102
if k == 0:
104103
ans.append(root.val)
105104
return
106-
dfs(root.left, k - 1)
107-
dfs(root.right, k - 1)
108-
dfs(p[root], k - 1)
105+
for nxt in (root.left, root.right, g[root]):
106+
if nxt != fa:
107+
dfs2(nxt, root, k - 1)
109108

110-
p = {}
111-
parents(root, None)
109+
g = {}
110+
dfs(root, None)
112111
ans = []
113-
vis = set()
114-
dfs(target, k)
112+
dfs2(target, None, k)
115113
return ans
116114
```
117115

@@ -128,40 +126,37 @@ class Solution:
128126
* }
129127
*/
130128
class Solution {
131-
private Map<TreeNode, TreeNode> p;
132-
private Set<Integer> vis;
133-
private List<Integer> ans;
129+
private Map<TreeNode, TreeNode> g = new HashMap<>();
130+
private List<Integer> ans = new ArrayList<>();
134131

135132
public List<Integer> distanceK(TreeNode root, TreeNode target, int k) {
136-
p = new HashMap<>();
137-
vis = new HashSet<>();
138-
ans = new ArrayList<>();
139-
parents(root, null);
140-
dfs(target, k);
133+
dfs(root, null);
134+
dfs2(target, null, k);
141135
return ans;
142136
}
143137

144-
private void parents(TreeNode root, TreeNode prev) {
138+
private void dfs(TreeNode root, TreeNode fa) {
145139
if (root == null) {
146140
return;
147141
}
148-
p.put(root, prev);
149-
parents(root.left, root);
150-
parents(root.right, root);
142+
g.put(root, fa);
143+
dfs(root.left, root);
144+
dfs(root.right, root);
151145
}
152146

153-
private void dfs(TreeNode root, int k) {
154-
if (root == null || vis.contains(root.val)) {
147+
private void dfs2(TreeNode root, TreeNode fa, int k) {
148+
if (root == null) {
155149
return;
156150
}
157-
vis.add(root.val);
158151
if (k == 0) {
159152
ans.add(root.val);
160153
return;
161154
}
162-
dfs(root.left, k - 1);
163-
dfs(root.right, k - 1);
164-
dfs(p.get(root), k - 1);
155+
for (TreeNode nxt : new TreeNode[] {root.left, root.right, g.get(root)}) {
156+
if (nxt != fa) {
157+
dfs2(nxt, root, k - 1);
158+
}
159+
}
165160
}
166161
}
167162
```
@@ -180,126 +175,75 @@ class Solution {
180175
*/
181176
class Solution {
182177
public:
183-
unordered_map<TreeNode*, TreeNode*> p;
184-
unordered_set<int> vis;
185-
vector<int> ans;
186-
187178
vector<int> distanceK(TreeNode* root, TreeNode* target, int k) {
188-
parents(root, nullptr);
189-
dfs(target, k);
179+
unordered_map<TreeNode*, TreeNode*> g;
180+
vector<int> ans;
181+
182+
auto dfs = [&](this auto&& dfs, TreeNode* node, TreeNode* fa) {
183+
if (!node) return;
184+
g[node] = fa;
185+
dfs(node->left, node);
186+
dfs(node->right, node);
187+
};
188+
189+
auto dfs2 = [&](this auto&& dfs2, TreeNode* node, TreeNode* fa, int k) {
190+
if (!node) return;
191+
if (k == 0) {
192+
ans.push_back(node->val);
193+
return;
194+
}
195+
for (auto&& nxt : {node->left, node->right, g[node]}) {
196+
if (nxt != fa) {
197+
dfs2(nxt, node, k - 1);
198+
}
199+
}
200+
};
201+
202+
dfs(root, nullptr);
203+
dfs2(target, nullptr, k);
190204
return ans;
191205
}
192-
193-
void parents(TreeNode* root, TreeNode* prev) {
194-
if (!root) return;
195-
p[root] = prev;
196-
parents(root->left, root);
197-
parents(root->right, root);
198-
}
199-
200-
void dfs(TreeNode* root, int k) {
201-
if (!root || vis.count(root->val)) return;
202-
vis.insert(root->val);
203-
if (k == 0) {
204-
ans.push_back(root->val);
205-
return;
206-
}
207-
dfs(root->left, k - 1);
208-
dfs(root->right, k - 1);
209-
dfs(p[root], k - 1);
210-
}
211206
};
212207
```
213208

214209
#### Go
215210

216211
```go
217-
/**
218-
* Definition for a binary tree node.
219-
* type TreeNode struct {
220-
* Val int
221-
* Left *TreeNode
222-
* Right *TreeNode
223-
* }
224-
*/
225212
func distanceK(root *TreeNode, target *TreeNode, k int) []int {
226-
p := make(map[*TreeNode]*TreeNode)
227-
vis := make(map[int]bool)
228-
var ans []int
229-
var parents func(root, prev *TreeNode)
230-
parents = func(root, prev *TreeNode) {
231-
if root == nil {
213+
g := make(map[*TreeNode]*TreeNode)
214+
ans := []int{}
215+
216+
var dfs func(node, fa *TreeNode)
217+
dfs = func(node, fa *TreeNode) {
218+
if node == nil {
232219
return
233220
}
234-
p[root] = prev
235-
parents(root.Left, root)
236-
parents(root.Right, root)
221+
g[node] = fa
222+
dfs(node.Left, node)
223+
dfs(node.Right, node)
237224
}
238-
parents(root, nil)
239-
var dfs func(root *TreeNode, k int)
240-
dfs = func(root *TreeNode, k int) {
241-
if root == nil || vis[root.Val] {
225+
226+
var dfs2 func(node, fa *TreeNode, k int)
227+
dfs2 = func(node, fa *TreeNode, k int) {
228+
if node == nil {
242229
return
243230
}
244-
vis[root.Val] = true
245231
if k == 0 {
246-
ans = append(ans, root.Val)
232+
ans = append(ans, node.Val)
247233
return
248234
}
249-
dfs(root.Left, k-1)
250-
dfs(root.Right, k-1)
251-
dfs(p[root], k-1)
235+
for _, nxt := range []*TreeNode{node.Left, node.Right, g[node]} {
236+
if nxt != fa {
237+
dfs2(nxt, node, k-1)
238+
}
239+
}
252240
}
253-
dfs(target, k)
254-
return ans
255-
}
256-
```
257-
258-
<!-- tabs:end -->
259-
260-
<!-- solution:end -->
261-
262-
<!-- solution:start -->
263-
264-
### 方法二
265241

266-
<!-- tabs:start -->
267-
268-
#### Python3
242+
dfs(root, nil)
243+
dfs2(target, nil, k)
269244

270-
```python
271-
# Definition for a binary tree node.
272-
# class TreeNode:
273-
# def __init__(self, x):
274-
# self.val = x
275-
# self.left = None
276-
# self.right = None
277-
278-
279-
class Solution:
280-
def distanceK(self, root: TreeNode, target: TreeNode, k: int) -> List[int]:
281-
def dfs1(root, fa):
282-
if root is None:
283-
return
284-
p[root] = fa
285-
dfs1(root.left, root)
286-
dfs1(root.right, root)
287-
288-
def dfs2(root, fa, k):
289-
if root is None:
290-
return
291-
if k == 0:
292-
ans.append(root.val)
293-
return
294-
for nxt in (root.left, root.right, p[root]):
295-
if nxt != fa:
296-
dfs2(nxt, root, k - 1)
297-
298-
p = {}
299-
dfs1(root, None)
300-
ans = []
301-
dfs2(target, None, k)
302-
return ans
245+
return ans
246+
}
303247
```
304248

305249
#### TypeScript
@@ -320,43 +264,36 @@ class Solution:
320264
*/
321265

322266
function distanceK(root: TreeNode | null, target: TreeNode | null, k: number): number[] {
323-
if (!root) return [0];
324-
325-
const g: Record<number, number[]> = {};
326-
327-
const dfs = (node: TreeNode | null, parent: TreeNode | null = null) => {
328-
if (!node) return;
329-
330-
g[node.val] ??= [];
331-
if (parent) g[node.val].push(parent.val);
332-
if (node.left) g[node.val].push(node.left.val);
333-
if (node.right) g[node.val].push(node.right.val);
267+
const g = new Map<TreeNode, TreeNode | null>();
268+
const ans: number[] = [];
334269

270+
const dfs = (node: TreeNode | null, fa: TreeNode | null) => {
271+
if (!node) {
272+
return;
273+
}
274+
g.set(node, fa);
335275
dfs(node.left, node);
336276
dfs(node.right, node);
337277
};
338278

339-
dfs(root);
340-
341-
const vis = new Set<number>();
342-
let q = [target!.val];
343-
344-
while (q.length) {
345-
if (!k--) return q;
346-
347-
const nextQ: number[] = [];
348-
349-
for (const x of q) {
350-
if (vis.has(x)) continue;
351-
352-
vis.add(x);
353-
nextQ.push(...g[x].filter(x => !vis.has(x)));
279+
const dfs2 = (node: TreeNode | null, fa: TreeNode | null, k: number) => {
280+
if (!node) {
281+
return;
354282
}
283+
if (k === 0) {
284+
ans.push(node.val);
285+
return;
286+
}
287+
for (const nxt of [node.left, node.right, g.get(node) || null]) {
288+
if (nxt !== fa) {
289+
dfs2(nxt, node, k - 1);
290+
}
291+
}
292+
};
355293

356-
q = nextQ;
357-
}
358-
359-
return [];
294+
dfs(root, null);
295+
dfs2(target, null, k);
296+
return ans;
360297
}
361298
```
362299

0 commit comments

Comments
 (0)