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
8890class 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 */
130128class 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 */
181176class Solution {
182177public:
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- */
225212func 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
322266function 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